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

  • 相关阅读:
    Ubuntu查看端口占用情况
    在jupyter中添加新的环境
    C++指针
    C++排序:冒泡排序,简单选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序
    查找一:C++静态查找
    C++链式队列
    C++顺序循环队列
    C++链式栈
    C++顺序栈
    C++双向循环链表
  • 原文地址:https://www.cnblogs.com/bwcx1375/p/7499031.html
Copyright © 2020-2023  润新知