线程数

Java OutOfMemoryError: unable to create new native thread

瘦欲@ 提交于 2020-01-29 00:35:36
java.lang.OutOfMemoryError共有8种类型,其中java.lang.OutOfMemoryError: unable to create new native thread是很常见的一种,这类错误通常发生在应用试图创建新线程时。 可能原因 系统内存耗尽,无法为新线程分配内存 创建线程数超过了操作系统的限制 解决方案 排查应用是否创建了过多的线程 通过jstack确定应用创建了多少线程?超量创建的线程的堆栈信息是怎样的?谁创建了这些线程?一旦明确了这些问题,便很容易解决。 调整操作系统线程数阈值 操作系统会限制进程允许创建的线程数,使用ulimit -u命令查看限制。某些服务器上此阈值设置的过小,比如1024。一旦应用创建超过1024个线程,就会遇到java.lang.OutOfMemoryError: unable to create new native thread问题。如果是这种情况,可以调大操作系统线程数阈值。 增加机器内存 如果上述两项未能排除问题,可能是正常增长的业务确实需要更多内存来创建更多线程。如果是这种情况,增加机器内存。 减小堆内存 一个老司机也经常忽略的非常重要的知识点:线程不在堆内存上创建,线程在堆内存之外的内存上创建。所以如果分配了堆内存之后只剩下很少的可用内存,依然可能遇到java.lang.OutOfMemoryError:

Docker+JMeter单机版+MinIO

孤人 提交于 2020-01-28 22:29:35
基于JMeter5.1.1+MinIO JMeter发起压测 MinIO作为文件服务器 一、目录结构: Dockerfile文件: FROM ubuntu:18.04 # 基础镜像 MAINTAINER yangjianliang <526861348@qq.com> # 作者 RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list # 设置apt源为阿里云源 RUN apt-get clean && \ apt-get update && \ apt-get upgrade -y # 检查软件包并升级 RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ apt-get install -y \ tzdata && \ rm -rf /var/lib/apt/lists/* # 设置时区 ADD jdk-8u201-linux-x64.tar.gz /usr/local/java ENV JAVA_HOME=/usr/local/java/jdk1.8.0_201 ENV JRE_HOME=/usr/local/java/jdk1.8.0_201/jre ENV PATH=$PATH:$JAVA_HOME

线程池 掌握治理线程的法宝

老子叫甜甜 提交于 2020-01-26 15:32:53
1.为什么需要线程池 在当今计算机的CPU计算速度非常快的情况下,为了能够充分利用CPU性能提高程序运行效率我们在程序中使用了线程。但是在高并发情况下会频繁的创建和销毁线程,这样就变相的阻碍了程序的执行速度,所以为了管理线程资源和减少线程创建以及销毁的性能消耗就引入了线程池。 2.什么场景下适合使用线程池 当服务器接收到大量任务时,如果使用线程池可以大量减少线程的创建与销毁次数,从而提升程序执行效率 在实际开发中,如果需要创建5个以上的线程,那么就可以使用线程池来管理 3.线程池参数介绍以及特点 https://user-gold-cdn.xitu.io/2020/1/12/16f9a146e43c9ba2?imageView2/0/w/1280/h/960/format/webp/ignore-error/1 3.1 corePoolSize和maxPoolSize corePoolSize:线程池在创建完时,里面并没有线程,只有当任务到来时再去创建线程。 maxPoolSize:线程池可能会在核心线程数的基础上额外增加一些线程,但是线程数量的上限是maxPoolSize。比如第一天执行的任务非常多,第二天执行的任务非常少,但是有了maxPoolSize参数,就可以增强任务处理的灵活性。 3.2 添加线程的规则 当线程数量小于corePoolSize即使线程没有在执行任务

多线程高并发这一篇就够了不用再去别家了

微笑、不失礼 提交于 2020-01-26 14:34:10
  高伸缩性的并发编程是一种艺术,是成为高级程序员的必备知识点之一,最近总结了一下相关方面的知识。    借鉴过得博客有的我也不知道原文作业是谁 https://blog.csdn.net/qq_34337272/article/details/81072874 https://www.cnblogs.com/dolphin0520/p/3932921.html 一、线程 什么是线程? 线程是进程中单一顺序的控制流。 什么是进程? 进程是程序运行的过程。 1、进程与线程的关系: 1)线程是进程的最小执行单元; 2)一个进程中至少存在一个线程; 3)线程决定进程的生命周期 —— 一个线程启动,进程就开始执行;所有线程执行结束,这个进程执行结束; 4)多个线程共享一个进程的内存空间、一组系统资源。 2、进程与线程的区别: 1)每个进程都有自己的独立的内存空间、一组系统资源,而线程共享所属进程的内存空间、一组系统资源; 进程是独立的,同一个进程的线程是有联系的。 2)进程之间通信开销较大,线程之间通信开销较小。 3、多线程 一个进程中可以同时存在多个线程; 同一个进程中的多个线程之间可以并发执行; 多线程的执行方式:抢占式; 抢占CPU资源,计算机由CPU执行程序,只有拥有CPU资源的程序,才会被执行。 CUP资源:CUP的控制权,这个控制权具有时间性,时间长度是随机的;这段时间非常短

Java性能优化

こ雲淡風輕ζ 提交于 2020-01-26 07:55:10
随着系统数据量的不断增长, 访问量的不断提升, 系统的响应通常会越来越慢, 又或是编写的新的应用在性能上无法满足需求, 这个时候需要对系统的性能进行调优, 调优过程是构建高性能应用的必备过程, 也是一个相当复杂的过程, 而且涉及到了很多的方面, 硬件、操作系统、 运行环境软件以及应用本身, 要实现调优, 首先需要做的是找到性能低的根本原因, 然后才是针对性的进行调优, 本章节就来介绍下寻找性能瓶颈以及调优的一些技术上的方法。 CPU 消耗分析 当 CPU 消耗过高时, 对于多线程的 Java 应用而言, 最明显的性能影响是线程执行业务处理的速度大幅度下降。 在分析 Java 应用中什么动作造成了 CPU 的消耗时, 首先需要找到的为消耗了 较多 CPU资源的线程, 然后根据所消耗的 CPU 的类型并结合线程 dump 来找到造成 CPU 资源消耗高的具体原因。 在 linux 中, 可通过 top 或 pidstat 方式来查看进程中线程的 CPU 的消耗状况。 top 输入 top 命令后即可查看 CPU 的消耗情况, CPU 的信息在 TOP 视图的上面几行中, 图示如下: 在此需要关注的为 Cpu 那行的信息, 其中 4.0% us 表示的为用户占用了 4%的 CPU 时间,主要为所运行的应用程序对 CPU 的消耗; 8.9% sy 表示的为系统占用了 8.9%的 CPU

java线程池ThreadPoolExecutor

╄→尐↘猪︶ㄣ 提交于 2020-01-26 04:34:14
1 submit的Runnable为什么通过Future获取任务的执行结果 submit的Runnable被封装成了FutureTask对象,并且返回。 Runnable执行的结果是在哪里交给FutureTask的? FutureTask重写了Runnable的run()方法,在这个run()方法中,将任务的返回值放在了FutureTask的outcome成员中。 这样在主线程中就可以获取到该任务的执行结果了。 如果想要获取任务真正的执行结果得传入一个Callable类型的任务,而不能是Runnable类型的任务。如果传入Runnable类型的任务,就算给了一个返回值,也不是Runnable任务的返回值,而就是这个指定的返回值。 2 beforeExecute和afterExecute有什么用 beforeExecute是在任务执行之前执行的,afterExecute是在任务执行之后执行的,可以在里面添加日志、监控、统计信息。比如统计各个线程的执行时间等。 3 线程池的任务队列 线程池的任务队列就是一个BlockingQueue,可以是ArrayBlockingQueue,这个时候任务队列是固定大小的,如果任务过多的话,就会出现处理不了的情况。 线程池的任务队列的数据是自己设置的。 4 线程池的线程数目 4.1 corePoolSize 向线程池添加新的任务的时候

接口测试平台:支持多线程执行(压测)

情到浓时终转凉″ 提交于 2020-01-25 07:19:39
由于testng本身是支持多线程执行的,我们只需要调用testng的多线程就可以。 集合详情内新增了两个字段:threadPoolSize和repeatTimes,对应线程数和重复执行次数。 Server端代码,新增了一个MultiThreadingListener监听类,用以修改testng的InvocationCount和ThreadPoolSize。(详细用法同学们可以百度自行搜索“testng注解”) public class MultiThreadingListener implements IAnnotationTransformer { @Override public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) { // 设置线程执行次数(重复次数 * 线程池内线程数) annotation.setInvocationCount(ApiTestConfig.repeatTimes * ApiTestConfig.threadPoolSize); // 线程池内线程数 annotation.setThreadPoolSize(ApiTestConfig.threadPoolSize); } }

java - jdk线程池详解

折月煮酒 提交于 2020-01-25 03:51:56
线程池参数详解 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)   参数 说明 corePoolSize 表示常驻核心线程数量。 maximumPoolSize 表示线程池中能同时执行的最大线程数量。这个值必须大于等于corePoolSize,如果这两个值相等,那就是固定大小的线程池。 keepAliveTime 表示线程池中除常驻核心线程之外的其他线程的空闲时间,如果超过这个时间就会销毁。 unit keepAliveTime的单位。 workQueue 任务队列,被提交但尚未被执行的任务。 threadFactory 表示生成线程池中工作线程的线程工厂。 handler 拒绝策略,表示当队列满了且工作线程大于等于线程池的最大线程数该采用什样的拒绝策略。   拒绝策略 说明 AbortPolicy(默认) 直接抛出RejectedExecutionException异常阻止系统正常运行。 CallerRunsPolicy "调用者运行

线程池工具ThreadPoolExecutor

人盡茶涼 提交于 2020-01-24 02:44:23
JDK1.5中引入了强大的concurrent包,其中最常用的莫过了线程池的实现ThreadPoolExecutor,它给我们带来了极大的方便,但同时,对于该线程池不恰当的设置也可能使其效率并不能达到预期的效果,甚至仅相当于或低于单线程的效率。 ThreadPoolExecutor类可设置的参数主要有: corePoolSize 在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行任务,(除非调用了 prestartAllCoreThreads()或者 prestartCoreThread()方法,从这2个方法的名字就可以看出,是预创建线程的意思,即在没有任务到来之前就创建corePoolSize个线程或者一个线程)。 默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中。核心线程在allowCoreThreadTimeout被设置为true时会超时退出,默认情况下不会退出。 maxPoolSize 当线程数大于或等于核心线程,且任务队列已满时,线程池会创建新的线程,直到线程数量达到maxPoolSize。如果线程数已等于maxPoolSize,且任务队列已满,则已超出线程池的处理能力,线程池会拒绝处理任务而抛出异常。

JMeter之一个简单的性能测试

瘦欲@ 提交于 2020-01-23 17:02:21
测试资源准备: 1)测试目标网站是 https://www.cnblogs.com/DeryKong/ 2)测试目的是该网站在负载达到20 QPS 时的响应时间。 QPS 解释   QPS : Query Per Second 每秒查询率。是一台查询服务器每秒能够处理的查询次数。在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。   为了达成预期的测目的,需要需要在jmeter中建立一个测试计划。因为本次测试仅要求完成对fnng.cnblogs.com 和 tt-topia.rhcloud.com 两个博客首页请求,因此只需要使用HTTP Request Sampler 即可 建立测试计划   启动jmeter后,jmeter会自动生成一个空的测试计划,用户可以基于该测试计划建立自己的测试计划。 添加线程组   一个性能测试请求负载是基于一个线程组完成的。一个测试计划必须有一个线程组。测试计划添加线程组非常简单。在测试计划右键弹出下拉菜单(添加-->Threads(Users)--->线程组)中选择线程组即可。   JMeter中 每个测试计划至少需要包含一个线程组,当然也可以在一个计划中创建多个线程组,那么多个线程组之间又会怎样的顺序执行(串行还是并行)?在测试计划下面多个线程是并行执行的,也就是说这些线程组是同时被初始化并同时执行线程组下的Sampler的。