JVM性能优化
Posted 何必怀念
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM性能优化相关的知识,希望对你有一定的参考价值。
- java应用程序是应用在JVM上的,你们对JVM又有多少了解呢?JVM将内存分为三部分:NEW(年轻代)、Tenured(年老代)、Perm(永久代)。
(1)年轻代:用来存放java分配的新对象。
(2)年老代:经过垃圾回收没有被回收掉的对象被复制到年老代
(3)永久代:存放class、method信息
- 内存泄漏以及解决方法:
一、系统崩溃之前的现象
(1)、每次垃圾回收的时间都比较长,时间在逐渐的延长
二、生成堆的dump文件
(1)、通过JMX的MBean生成当前的Heap信息,大小为一个3G(整个堆的大小)的hprof文件,如果没有启动JMX可以通过Java的jmap命令来生成该文件。
三、分析内存泄漏
通过Mat我们能清楚地看到,哪些对象被怀疑为内存泄漏,哪些对象占的空间最大及对象的调用关系。针对本案,在ThreadLocal中有很多的JbpmContext实例,经过调查是JBPM的Context没有关闭所致。另外,通过Mat或JMX我们还可以分析线程状态,可以观察到线程被阻塞在哪个对象上,从而判断系统的瓶颈。
解决方法:
(一)、为什么崩溃前垃圾回收的时间越来越长?
根据内存模型和垃圾回收算法,垃圾回收分两部分:内存标记、清除(复制),标记部分只要内存大小固定时间是不变的,变的是复制部分,因为每次垃圾回收都有一些回收不掉的内存,所以增加了复制量,导致时间延长。所以,垃圾回收的时间也可以作为判断内存泄漏的依据
(二)、为什么Full GC的次数越来越多?
因此内存的积累,逐渐耗尽了年老代的内存,导致新对象分配没有更多的空间,从而导致频繁的垃圾回收
(三)、为什么年老代占用的内存越来越大?
因为年轻代的内存无法被回收,越来越多地被Copy到年老代
四、调优方法的原则
(1)、多数导致GC问题的java应用,都不是因为我们参数设置错误,而是代码问题
(2)、在应用上线之前,先考虑将机器的JVM参数设置到最优(最合适)。
(3)、减少创建对象的数量。
(4)、减少使用全局变量和大对象。
以上是关于JVM性能优化的主要内容,如果未能解决你的问题,请参考以下文章