标签:越来越大 关闭 垃圾回收算法 复制 永久代 调用 状态 通过 时间
(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)、减少使用全局变量和大对象。
标签:越来越大 关闭 垃圾回收算法 复制 永久代 调用 状态 通过 时间
原文地址:http://www.cnblogs.com/bwcx1375/p/7499031.html