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)、减少使用全局变量和大对象。

 

posted @ 2017-09-09 19:08  怀念-2018  阅读(160)  评论(0编辑  收藏  举报