码迷,mamicode.com
首页 > 其他好文 > 详细

JVM性能优化

时间:2017-09-09 19:39:13      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:越来越大   关闭   垃圾回收算法   复制   永久代   调用   状态   通过   时间   

  •   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性能优化

标签:越来越大   关闭   垃圾回收算法   复制   永久代   调用   状态   通过   时间   

原文地址:http://www.cnblogs.com/bwcx1375/p/7499031.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!