线程数

多个角度全方位带你深入理解 Java 线程池

霸气de小男生 提交于 2019-12-28 21:01:10
一、简介 什么是线程池 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。 为什么要用线程池 如果并发请求数量很多,但每个线程执行的时间很短,就会出现频繁的创建和销毁线程。如此一来,会大大降低系统的效率,可能频繁创建和销毁线程的时间、资源开销要大于实际工作的所需。 正是由于这个问题,所以有必要引入线程池。使用 线程池的好处 有以下几点: 降低资源消耗 - 通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度 - 当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性 - 线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必须对其原理了如指掌。 二、Executor 框架 Executor 框架是一个根据一组执行策略调用,调度,执行和控制的异步任务的框架,目的是提供一种将”任务提交”与”任务如何运行”分离开来的机制。 核心 API 概述 Executor 框架核心 API 如下: Executor - 运行任务的简单接口。 ExecutorService - 扩展了 Executor 接口。扩展能力: 支持有返回值的线程; 支持管理线程的生命周期。 ScheduledExecutorService - 扩展了

JDK、Dubbo中的线程池

别说谁变了你拦得住时间么 提交于 2019-12-27 05:14:05
如果某个Dubbo请求并发比较高,同时响应上由于数据库原因或者网络原因导致接口内部请求慢,则该Dubbo方法及其容易导致Dubbo里的线程池耗尽,此时消费端会收到如下异常堆栈信息 Caused by: java.util.concurrent.RejectedExecutionException: Thread pool is EXHAUSTED! Thread Name: DubboServerHandler-192.168.112.12:8045, Pool Size: 200 (active: 200, core: 200, max: 200, largest: 200), Task: 165633 (completed: 165433), Executor status:(isShutdown:false, isTerminated:false, isTerminating:false), in dubbo://192.168.112.12:8045! at com.alibaba.dubbo.common.threadpool.support.AbortPolicyWithReport.rejectedExecution(AbortPolicyWithReport.java:53) at java.util.concurrent.ThreadPoolExecutor

解决Unable to create new native thread

不羁的心 提交于 2019-12-26 20:36:00
两种类型的Out of Memory java.lang.OutOfMemoryError: Java heap space error 当JVM尝试在堆中分配对象,堆中空间不足时抛出。一般通过设定JAVA启动参数 -Xmx 最小可用内存解决。 java.lang.OutOfMemoryError: Unable to create new native thread 当JVM向OS申请创建线程,而OS不能分配一个本地线程时抛出。 了解系统参数 系统级最大进程ID $ sysctl -a | grep kernel.pid_max kernel.pid_max = 32768 # 输出结果表示当前系统允许的最大进程数为32768 $ cat /proc/sys/kernel/pid_max # 命令功用与上述同样 $ echo 200000 > /proc/sys/kernel/pid_max # 修改系统级最大进程数为200000,可通过sysctl查看修改 系统级最大线程数 # /proc/sys/kernel/threads-max 限制了系统级最大线程数 $ echo 120000 > /proc/sys/kernel/threads-max # 修改系统级最大线程数为120000,可通过sysctl查看修改 # Linux没有每个进程单独的最大线程数限制 ulimit

多线程与Android线程性能优化

假装没事ソ 提交于 2019-12-26 17:17:38
目录 多线程与Android线程性能优化 基础概念 CPU核心数和线程数的关系 CPU时间片轮转机制 什么是进程和线程 澄清并行和并发 高并发编程的意义、好处和注意事项 认识Java里的线程 线程的启动与中止 对Java里的线程再多一点点认识 深入理解run()和start() 其他的线程方法 线程间的共享和协作 线程间的协作 ThreadLocal 显式锁 Lock接口和synchronized的比较 Lock接口和核心方法 可重入锁ReentrantLock、所谓锁的公平和非公平 读写锁ReentrantReadWriteLock Condition接口 多线程与Android线程性能优化 基础概念 CPU核心数和线程数的关系 多核心:也指单芯片多处理器( Chip Multiprocessors,简称CMP),CMP是由美国斯坦福大学提出的,其思想是将大规模并行处理器中的SMP(对称多处理器)集成到同一芯片内,各个处理器并行执行不同的进程。这种依靠多个CPU同时并行地运行程序是实现超高速计算的一个重要方向,称为并行处理 多线程: Simultaneous Multithreading.简称SMT.SMT可通过复制处理器上的结构状态,让同一个处理器上的多个线程同步执行并共享处理器的执行资源可最大限度地实现宽发射、乱序的超标量处理,提高处理器运算部件的利用率,缓和由于数据相关或

Android 9.0 SurfaceFlinger---configureRpcThreadpool

我是研究僧i 提交于 2019-12-25 07:31:10
目录 surfaceflinger启动 configureRpcThreadpool 当前进程fd中hwbinder框架的初始化 setThreadPoolConfiguration surfaceflinger启动 surfaceflinger可执行文件由main_surfaceflinger.cpp 文件独立编译而成,主要负责搭建进程启动环境。 \frameworks\native\services\surfaceflinger\main_surfaceflinger.cpp int main(int, char**) { signal(SIGPIPE, SIG_IGN); //当对端(客户端/服务端)的socket关闭时,防止进程退出。 //hidl service启动时要设置binder的线程池 hardware::configureRpcThreadpool(1 /* maxThreads */, //用于设置 当前进程用于 hwbinder 通信的最大线程数: false /* callerWillJoin */); configureRpcThreadpool 设置用于 hwbinder 通信的线程数 configureRpcThreadpool 用于设置 当前进程用于 hwbinder 通信的最大线程数: \system\libhidl\transport

深入理解 Java 线程池

本秂侑毒 提交于 2019-12-24 10:38:47
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 一、简介 什么是线程池 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。 为什么要用线程池 如果并发请求数量很多,但每个线程执行的时间很短,就会出现频繁的创建和销毁线程。如此一来,会大大降低系统的效率,可能频繁创建和销毁线程的时间、资源开销要大于实际工作的所需。 正是由于这个问题,所以有必要引入线程池。使用 线程池的好处 有以下几点: 降低资源消耗 - 通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度 - 当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性 - 线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必须对其原理了如指掌。 二、Executor 框架 Executor 框架是一个根据一组执行策略调用,调度,执行和控制的异步任务的框架,目的是提供一种将”任务提交”与”任务如何运行”分离开来的机制。 核心 API 概述 Executor 框架核心 API 如下: Executor - 运行任务的简单接口。 ExecutorService - 扩展了 Executor 接口。扩展能力: 支持有返回值的线程;

jmeter命令行运行-单节点

只谈情不闲聊 提交于 2019-12-23 02:49:09
jmeter有自己的GUI页面,但是当线程数很多或者现在有很多的测试场景都是基于linux下进行压测,这时我们可以使用jmeter的命令行方式来执行测试,该篇文章介绍jmeter单节点命令运行方式。 1:准备单节点linux机器,并安装jdk,即安装java环境 我的linux机器为:134.64.14.96,至于怎么安装java环境就不说了 2:上传并解压最新的jmeter包到linux服务器上,目前jmeter版本已经进入3了这里给出我的安装包云盘地址:http://pan.baidu.com/s/1bI3r2I 密码:f5ll 3:由于linux上面没有像windows那样直观的jmeter的gui页面使得我们制定jmeter的jmx脚本比较费力(一般linux服务器为了性能考虑不会装图形化界面),所以jmx脚本我们可以在本地windows机器上利用jmeter的gui页面先制作好,然后上传到服务器上去执行 下面用百度请求为例: 在本地双击jmeter的bin目录下的jmeter.bat文件启动jmeter的gui页面,生成一个百度的接口请求jmx脚本,并在本地调试通过 调试通过以后,此时功能测试的脚本就生成好了,我们在将此脚本做一定配置和修改,使其成为一个可以放在服务端跑的性能脚本 一般我都做两步: 第一步:删除-查看结果树等一切监听器 ,目的是

httpClient不是单例的导致OOM

萝らか妹 提交于 2019-12-22 10:48:05
案发现场 昨天晚上突然短信收到 APM (即 Application Performance Management 的简称,我们内部自己搭建了这样一套系统来对应用的性能、可靠性进行线上的监控和预警的一种机制)大量告警 画外音: 监控是一种非常重要的发现问题的手段,没有的话一定要及时建立哦 紧接着运维打来电话告知线上部署的四台机器全部 OOM (out of memory, 内存不足),服务全部不可用,赶紧查看问题! 问题排查 首先运维先重启了机器,保证线上服务可用,然后再仔细地看了下线上的日志,确实是因为 OOM 导致服务不可用 第一时间想到 dump 当时的内存状态,但由于为了让线上尽快恢复服务,运维重启了机器,导致无法 dump 出事发时的内存。所以我又看了下我们 APM 中对 JVM 的监控图表 不看不知道,一看吓一跳,从 16:00 开始应用中创建的线程居然每时每刻都在上升,一直到 3w 左右,重启后(蓝色箭头),线程也一直在不断增长),正常情况下的线程数是多少呢,600! 问题找到了,应该是在下午 16:00 左右发了一段有问题的代码,导致线程一直在创建,且创建的线程一直未消亡! 查看发布记录,发现发布记录只有这么一段可疑的代码 diff:在 HttpClient 初始化的时候额外加了一个 evictExpiredConnections 配置 问题定位了

使用多线程的准备知识

旧巷老猫 提交于 2019-12-21 07:21:47
一、为什么要使用多线程? 【使计算机所有资源在执行任务的时候能够全部利用上,以提升计算机资源利用率的方式来提升系统执行效率】   CPU的单核运行速度由于硬件技术问题已经遇到瓶颈,而概念性的“光脑”貌似离我们还很遥远,现在的计算机性能提升方向是向多核发展。多核同时工作,协同完成任务。大家熟知的神威·太湖之光超级计算机总共使用了40960颗处理器,总计拥有10649600颗核心、1.31PB内存。即使是目前市场上的主流家用电脑也一般达到四核心八线程的配置标准。那么对于这些多核的CPU, 在开发软件的时候就不得不考虑如何充分利用上每一个核的性能,以至于使系统运行的效率更高。 二、CPU是执行的是线程任务还是进程任务? 【CPU执行的是线程中定义的任务】 进程是对内存资源的抽象,线程是对执行任务的抽象。 CPU执行的是线程任务 ,和进程没有任何关系。所以, CPU中的核在任意时间点只能执行某一个线程的任务 ,具体执行哪个线程就要看操作系统的任务调度策略。 在单核多线程任务中,操作系统会把CPU资源按照时间片划分,根据线程的优先级选择线程进行执行任 务。 三、 程序中线程的数量控制在核数的1~2倍对吗? 【不对!】 左图为工作时win10 四核八线程 线程数: 2094。右图为闲置centos7 单核 线程数 :127 。 线程数量远远超过CPU核心数量的上百倍 。 所以在开发程序过程中

JVM调优的几种策略

早过忘川 提交于 2019-12-21 06:17:33
一、JVM内存模型及垃圾收集算法 1. 根据Java虚拟机规范, JVM将内存划分为: New(年轻代) Tenured(年老代) 永久代(Perm) 其中New和Tenured属于堆内存,堆内存会从JVM启动参数(-Xmx:3G)指定的内存中分配, Perm不属于堆内存,有虚拟机直接分配 ,但可以通过 -XX:PermSize -XX:MaxPermSize 等参数调整其大小。 年轻代(New): 年轻代用来存放JVM刚分配的Java对象 年老代(Tenured):年轻代中经过垃圾回收没有回收掉的对象将被Copy到年老代 永久代(Perm):永久代存放Class、Method元信息,其大小跟项目的规模、类、方法的量有关,一般设置为128M就足够,设置原则是预留30%的空间。 New又分为几个部分: Eden: Eden用来存放JVM刚分配的对象 Survivor1 Survivro2: 两个Survivor空间一样大 ,当Eden中的对象经过垃圾回收没有被回收掉时,会在两个Survivor之间来回Copy,当满足某个条件,比如Copy次数,就会被Copy到Tenured。显然, Survivor只是增加了对象在年轻代中的逗留时间 ,增加了被垃圾回收的可能性。 2.垃圾回收算法 垃圾回收算法可以分为三类,都基于标记-清除(复制)算法:   Serial算法(单线程) 并行算法