【JVM虚拟机】(4)---性能调优

JVM性能调优

一、调优策略

对于GC的性能主要有2个方面的指标:吞吐量throughput(工作时间不算gc的时间占总的时间比)和暂停pause(gc发生时app对外显示的无法响应)。

1、调优的目的

调优的最终目的当然增大吞吐量,减少暂停时间咯,映射到GC层面主要关心下面这两点:

(1)将转移到老年代的对象数量降低到最小。

(2)减少full GC的执行时间。(尽量减少GC的次数)

那什么情况对象会转移到老年代,主要有这四种:

(1)新生代对象每经历依次minor gc,年龄会加一,当达到年龄阀值会直接进入老年代。阀值大小一般为15。

(2)Survivor空间中年龄所有对象大小的总和大于survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,而无需等到年龄阀值。

(3)大对象直接进入老年代。

(4)新生代复制算法需要一个survivor区进行轮换备份,如果出现大量对象在minor gc后仍然存活的情况时,就需要老年代进行分配担保,让survivor无法容纳的对象直接进入老年代。

再来分析为什么说要减少full GC时间次数,那得先看GC的两大分类

Partial GC:并不收集整个GC堆的模式

Young GC:只收集young gen的GC

Old GC:只收集old gen的GC。只有CMS的concurrent collection是这个模式

Mixed GC:收集整个young gen以及部分old gen的GC。只有G1有这个模式

Full GC:针对整个新生代、老生代、元空间(metaspace,java8以上版本取代perm gen)的全局范围的GC。这里就明白为什么要减少Full GC的次数了。

一般Full GC所花费的时间是Young GC的十倍。

2、哪些方面可以考虑调优?

为了达到上面的目的,一般地,你可以考虑调优的有:

(1)减少使用全局变量和大对象。

(2)新生代和老年代的大小是否合适。

(3)新生代和老年代所占的比例是否合适。

(4)幸存者区和新生区所占的比例到是否合适。

(5)选择合适的GC收集器。

3、什么情况说明GC已经不错了呢?

此外,如果GC执行时间满足下列所有条件,就没有必要进行GC优化了:

Minor GC执行非常迅速(50ms以内)

Minor GC没有频繁执行(大约10s执行一次)

Full GC执行非常迅速(1s以内)

Full GC没有频繁执行(大约10min执行一次)

括号中的数字并不是绝对的,它们也随着服务的状态而变化。

二、调优经验(规则)

这些规则,一般是大家比较建议的,可以作为初始配置的时候进行配置建议,当然具体的还得通过JVM工具监测来具体分析。

(1) -Xmx 和-Xms 一般设置为一样大小。这样能稍微提高GC的运行效率,因为他/她不再需要估算堆是否需要调整大小了。

(2)官方推荐新生代占堆的3/8。

(3)幸存代占新生代的1/10。

(4)垃圾收集器如果内存比较大建议G1收集器,当然也可以用CMS收集器。

(5)-XX:+DisableExplicitGC禁止System.gc(),免得程序员误调用gc方法影响性能;

(6)吞吐量优先的应用:一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代.原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而年老代尽存放长期存活对象.

(7)采用并发回收时,年轻代小一点,年老代要大,因为年老大用的是并发回收,即使时间长点也不会影响其他程序继续运行,网站不会停顿.

(8)使用CMS的好处是用尽量少的新生代, 然后老生代利用CMS并行收集, 这样能保证系统低延迟的吞吐效率。

下面附上进行JVM的优化的一些参数:

-Xmx300m                        最大堆大小
-Xms300m                       初始堆大小
-Xmn100m                        年轻代大小
-XX:SurvivorRatio=8             Eden区与Survivor区的大小比值,设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10

-XX:+UseG1GC                    使用 G1 (Garbage First) 垃圾收集器
-XX:MaxTenuringThreshold=14        提升年老代的最大临界值(tenuring threshold). 默认值为 15[每次GC,增加1岁,到15岁如果还要存活,放入Old区]
-XX:ParallelGCThreads=8            设置垃圾收集器在并行阶段使用的线程数[一般设置为本机CPU线程数相等,即本机同时可以处理的个数,设置过大也没有用]
-XX:ConcGCThreads=8              并发垃圾收集器使用的线程数量

-XX:+DisableExplicitGC       禁止在启动期间显式调用System.gc()

-XX:+HeapDumpOnOutOfMemoryError   OOM时导出堆到文件
-XX:HeapDumpPath=d:/a.dump        导出OOM的路径
-XX:+PrintGCDetails              打印GC详细信息
-XX:+PrintGCTimeStamps            打印CG发生的时间戳
-XX:+PrintHeapAtGC               每一次GC前和GC后,都打印堆信息
-XX:+TraceClassLoading            监控类的加载
-XX:+PrintClassHistogram          按下Ctrl+Break后,打印类的信息

参考

JVM参数设置(主要看它的参数表格)

想太多,做太少,中间的落差就是烦恼。想没有烦恼,要么别想,要么多做。少校【18】

原文地址:https://www.cnblogs.com/qdhxhz/p/9215571.html

时间: 2024-10-09 16:11:35

【JVM虚拟机】(4)---性能调优的相关文章

JVM原理和性能调优

JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境. 1.创建JVM装载环境和配置 2.装载JVM.dll 3.初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例 4.调用JNIEnv实例装载并处理class类. 在我们运行和调试Java程序的时候,经常会提到一个JVM的概念.JVM是Java程序运行的环境,但是他同时一个操作系统的一个应用程序一个进程,因此他也有他自己的运行的生命周期,也有自己的代码和数据空间. 首先来说

jvm原理及性能调优系列(jvm调优)

个人认为jvm调优主要通过以下方法解决 1.设置合适的最大堆内存(新生代和老生代的最大和值)和最小堆内存(jvm启动时占用的操作系统内存大小),及设置好堆的比例分配. 2.设置合适的新生代 因为对其对系统性能和GC回收有一定的影响. 3.设置合适的持久代 因为其直接决定系统可以支持多少个类定义和多少个常亮. 4.设置合适的线程栈 否则系统可能因为线程所需资源和空间不够而异常退出.

jvm原理及性能调优系列(调优工具)

 Linux命令行工具: 1.TOP命令:能够显示系统各个进程占用资源状况. 2.SAR命令:能够周期性地对系统CPU和内存采样. 3.VMSTATE命令:它可以统计CPU和内存使用情况和SWAP使用信息,也可以周期性地统计信息. 4.IOSTAT命令:提供详尽的IO信息 5.PIDSTAT命令:不但可以检测进程,还能够检测线程.  windows检测工具: 1.任务管理器 2.Perfmon性能工具 3.Process Exploer 4.PSLIST JDK工具: 1.JPS 列出java的

jvm内存溢出性能调优

常用工具及命令 jps jstat Top jstack jmap mat工具 top -Hp pid可以查看某个进程的线程信息 -H 显示线程信息,-p指定pid jps:可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称及进程pid 如:jps -l pid Jstack命令 jstack是java虚拟机自带的一种堆栈跟踪工具.用于生成java虚拟机当前时刻的线程快照.线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,

jvm原理及性能调优系列(自动内存管理机制)

JAVA内存区域和内存溢出异常 1.JAVA运行时数据区如下图 程序计数器:当前线程正在执行的代码的行号指示器.是线程私有的.它是JAVA虚拟机唯一没有指定OutOfMerroryError异常的区域. 虚拟机栈:是线程私有的.描述的是Java方法执行时的内存模型.每个方法被创建时,会创建一个栈帧,用于存储局部变量表.操作表.方法出口等信息. 本地方法栈:其发挥的作用与虚拟机栈类似.不同的是虚拟机栈为虚拟机方法服务,本地栈位为虚拟机使用到的Native方法服务. Java堆:被所有线程共享的一块

深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理)视频教程

14套java精品高级架构课,缓存架构,深入Jvm虚拟机,全文检索Elasticsearch,Dubbo分布式Restful 服务,并发原理编程,SpringBoot,SpringCloud,RocketMQ中间件,Mysql分布式集群,服务架构,运 维架构视频教程 14套精品课程介绍: 1.14套精 品是最新整理的课程,都是当下最火的技术,最火的课程,也是全网课程的精品: 2.14套资 源包含:全套完整高清视频.完整源码.配套文档: 3.知识也 是需要投资的,有投入才会有产出(保证投入产出比是

JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解

现实企业级Java开发中,有时候我们会碰到下面这些问题: OutOfMemoryError,内存不足 内存泄露 线程死锁 锁争用(Lock Contention) Java进程消耗CPU过高 ...... 这些问题在日常开发中可能被很多人忽视(比如有的人遇到上面的问题只是重启服务器或者调大内存,而不会深究问题根源),但能够理解并解决这些问题是Java程序员进阶的必备要求.本文将对一些常用的JVM性能调优监控工具进行介绍,希望能起抛砖引玉之用.本文参考了网上很多资料,难以一一列举,在此对这些资料的

[转]JVM性能调优监控工具

http://my.oschina.net/feichexia/blog/196575?p=1#comments JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps.jstack.jmap.jhat.jstat.hprof等小巧的工具,本博客希望能起抛砖引玉之用,让大家能开始对JVM性能调优的常用工具有所了解. 现实企业级Java开发中,有时候我们会碰到下面这些问题: OutOfMemoryError,内存不足 内存泄露 线程死锁 锁争

Tomcat(JVM)性能调优

Tomcat架构图 Tomcat与JVM版本优化Tomcat的运行是基于Java的虚拟机.SUN的JVM动态库有client和server两个版本,分别针对桌面应用和服务器应用做了相应的优化,client版本加载速度较快,server版本加载速度较慢但运行起来较快.在命令行输入 java -version 可以看到jvm目前配置的是哪个版本.如果要修改jvm的版本,可更改默认java.exe调用的jvm.dll,这个由jvm.cfg决定.编辑%JAVA_HOME%/jre/lib/i386/jv