[Java Performance] JVM 线程调优
调整线程栈空间
当很缺少内存时,能够调整线程使用的内存。
每一个线程都有一个栈,用来记录该线程的调用栈信息。线程中的栈的默认空间是有OS和JVM的版本号决定的:
| OS | 32-bit | 64-bit |
|---|---|---|
| Linux | 320 KB | 1 MB |
| Mac OS | N/A | 1 MB |
| Solaris Sparc | 512 KB | 1 MB |
| Solaris X86 | 320 KB | 1 MB |
| Windows | 320 KB | 1 MB |
当栈空间被设置的过小时,可能会由于有较长的调用栈而抛出StackOverflowError。
在64位的JVM中,一般不须要改动这个值。除非内存确实很吃紧。而在32位的JVM中。能够将这个值从320KB设置成128KB,为了给堆内存腾出很多其它的空间。
更改线程栈空间的指令:-Xss=N 比方:-Xss=256k
偏见锁(Biased
Locking)
当锁被多个线程所争夺时。JVM和OS能够选择将锁分配给哪个线程。能够使用一种公平的策略将锁分配给其它线程,或者也能够使用一种不公平(偏见)的策略。比方将锁再分配给上一次拥有该锁的线程。
将锁再次分配给上一次拥有该锁的线程,这样做的合理性在于:因为时间上的连续性,处理器中可能还缓存着和该线程所运行任务相关的数据。因此当线程再次运行时。准备上下文的时间就行节省下来。
当然,使用偏见锁本身须要记录一些相关数据,因此在某些时候反而会对性能有影响。
典型的比方,在非常多时候,假设将偏见锁应用在线程池中。那么性能反而会变差。假设一个应用并不须要使用偏见锁来作为锁分配的策略,那么能够通过:-XX:-UseBiasedLocking 来禁用它,由于默认是会启用偏见锁的,禁用它会提升些许性能。
锁的自旋(Lock
Spinning)
对于没有得到锁的线程。JVM有两种处理方式:
- 让线程进入一个忙循环(Busy Loop)。待它运行了一些指令后会再次检查须要的锁是否可用。
- 让线程进入一个队列,当须要的锁可用时通知它。此时CPU能够被其他线程使用。
假设处于竞争中的锁仅仅须要被持有一小段时间,那么使用第一种忙循环(也被称为线程自旋(Thread Spinning))的速度会比另外一种让线程进入队列的方式快的多。反之,当竞争中的锁会被线程持有较长的时间时,使用另外一种方式更优。这可以让CPU的有效利用率更高。
JVM会合理地选择使用哪种处理方式。首先会让线程自旋一段时间,假设还没有得到须要的锁,就会将该线程放入队列中等待,从而让出CPU资源给其他线程。
线程优先级
在Java API中。每一个线程都可以被设置一个优先级,OS会參考这个值。可是注意OS不过“參考”,并不一定会遵循它。OS会对每一个执行中的线程计算一个“当前”优先级。这个计算过程会考虑到设置的优先级,可是它不过众多因素中的一个。当中最重要的因素往往是这个线程已经执行了多长时间。
考虑这个因素是为了让每一个线程都可以得到执行的机会。
所以,不管线程被设置的优先级有多低,它们也总可以得到执行的机会。
另外,设置的线程优先级在不同的OS上的权重是不同的。
在基于Unix的系统上,线程的运行时间是主导线程当前优先级的因素,也就是说设置的线程优先级差点儿不会被“參考”。而在Windows系统上。设置的线程优先级的权重会略微高一些。
所以。不管是在哪个OS上,应用的性能都不能依赖于对线程设置优先级。假设某些任务的优先级确实高于另外一些任务,那么这一点须要被应用程序的逻辑来完毕,而不是通过设置线程的优先级来完毕。
一个办法将任务分配给不同的线程池,然后设置这些线程池的规模。
[Java Performance] JVM 线程调优的更多相关文章
- Java性能优化权威指南-读书笔记(五)-JVM性能调优-吞吐量
吞吐量是指,应用程序的TPS: 每秒多少次事务,QPS: 每秒多少次查询等性能指标. 吞吐量调优就是减少垃圾收集器消耗的CPU周期数,从而将更多的CPU周期用于执行应用程序. CMS吞吐调优 CMS包 ...
- jvm系列(六):Java服务GC参数调优案例
本文介绍了一次生产环境的JVM GC相关参数的调优过程,通过参数的调整避免了GC卡顿对JAVA服务成功率的影响. 这段时间在整理jvm系列的文章,无意中发现本文,作者思路清晰通过步步分析最终解决问题. ...
- jvm 命令使用调优 通过jstat、jmap对java程序进行性能调优
转载:http://blog.csdn.net/jerry024/article/details/8507589 转载: https://blog.csdn.net/zhaozheng7758/art ...
- Java架构师面试题——JVM性能调优
JVM内存调优 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数. 1.Full GC 会对整个堆进行整理,包括Young.Tenured和Perm.Full GC因为需要对 ...
- 【JAVA进阶架构师指南】之五:JVM性能调优
前言 首先给大家说声对不起,最近属实太忙了,白天上班,晚上加班,回家还要收拾家里,基本每天做完所有事儿都是凌晨一两点了,没有精力再搞其他的了. 好了,进入正题,让我们来聊聊JVM篇最后一个章节 ...
- JAVA系列之JVM内存调优
一.前提 JVM性能调优牵扯到各方面的取舍与平衡,往往是牵一发而动全身,需要全盘考虑各方面的影响.在优化时候,切勿凭感觉或经验主义进行调整,而是需要通过系统运行的客观数据指标,不断找到最优解.同时,在 ...
- Java性能优化权威指南-读书笔记(二)-JVM性能调优-概述
概述:JVM性能调优没有一个非常固定的设置,比如堆大小设置多少,老年代设置多少.而是要根据实际的应用程序的系统需求,实际的活跃内存等确定.正文: JVM调优工作流程 整个调优过程是不断重复的一个迭代, ...
- JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解
摘要: JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps.jstack.jmap.jhat.jstat.hprof等小巧的工具,本博客希望 ...
- JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解(转VIII)
JVM本身就是一个java进程,一个java程序运行在一个jvm进程中.多个java程序同时运行就会有多个jvm进程.一个jvm进程有多个线程至少有一个gc线程和一个用户线程. JDK本身提供了很多方 ...
随机推荐
- [bzoj1008](HNOI2008)越狱(矩阵快速幂加速递推)
Description 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱 In ...
- POJ 2139 Six Degrees of Cowvin Bacon (弗洛伊德最短路)
题意:奶牛拍电影,如果2个奶牛在同一场电影里演出,她们的合作度是1,如果ab合作,bc合作,ac的合作度为2,问哪一头牛到其他牛的合作度平均值最小再乘100 思路:floyd模板题 #include& ...
- mysql函数的使用create function myfunction(...
use test //必须在某个数据库下面创建 delimiter $ //创建 CREATE FUNCTION myFunction(ln int, ls int) //参数这里不能加def ...
- NServiceBus入门:多个endpoint(Introduction to NServiceBus: Multiple endpoints)
原文地址:https://docs.particular.net/tutorials/intro-to-nservicebus/3-multiple-endpoints/ 侵删. 目前为止,我们只是在 ...
- Tikhonov regularization和岭回归
就实现过程来讲,两者是一样的,都是最小二乘法的改进,对于病态矩阵的正则化,只不过分析的角度不一样,前者是解决机器学习中过拟合问题,机器学习一般是监督学习,是从学习角度来说的,后者是数学家搞的,是为了解 ...
- 为DbContextScope添加数据库事务提交完成事件
使用EF开发应用程序的一个难点就在于对其DbContext的生命周期管理,你的管理策略是否能很好的支持上层服务 使用独立事务,使用嵌套事务,并行执行,异步执行等需求? Mehdi El Gueddar ...
- druid+spring配置
web.xml配置 <!-- Druid,监控数据库,以及WEB访问连接信息 --> <!-- 配置好后访问 http://ip:port/projectName/druid/ind ...
- JS isNaN()函数
1.作用 isNaN() 函数用于检查其参数是否是非数字值. 2.JS <script> document.write(isNaN(123)); document.write(isNaN( ...
- 支持解析GitHub Flavored Markdown(GFM)的PHP库-Parsedown
网上搜索PHP的markdown解析库,只能找得到Michel的PHP Markdown,这个库很不错,但是他只能支持标准markdown和他自己定义的一套扩展php Markdown Extra.这 ...
- iOS:CYLTabBarController的具体使用实例:实现新浪微博的主流框架
使用CocoaPods或者手动集成将CYLTabBarController这个第三方框架导入项目后,截图如下: 在AppDelegate.m类中实现的代码如下: // AppDelegate.m // ...