jvm调优入门学习之堆内存

在上一篇中学习了栈内存的调优,现在学习一下堆内存的相关知识。

  1. 内存溢出

    执行如下代码

    jvm调优入门学习之堆内存

    执行结果为:

    jvm调优入门学习之堆内存

    接下来我们手动调整堆内存的大小,然后重新执行代码

    jvm调优入门学习之堆内存

    jvm调优入门学习之堆内存

     
  2. 堆内存诊断

    有如下代码块:

    jvm调优入门学习之堆内存

    这里休眠30秒为了方便我们执行jps和jmap命令

    当打印完1....后在idea自带的工具terminal中执行jps命令,jps命令的意思是:查看当前系统中有哪些Java进程

    jvm调优入门学习之堆内存

    发现我们自己创建的Java类的进程id为 30156,在执行  jmap -head 30156有如下结果:

    jvm调优入门学习之堆内存

    根据结果发现:当前Java代码在堆中的内存占用为4.4MB

    等待2....打印结束后在执行一遍 jmap -head 30156,结果如下:会发现堆内存的占用多了10MB。正好是我们创建的

    array数组的占用大小
    jvm调优入门学习之堆内存
    等3.....打印结束后在执行一遍  jmap -head 30156,结果如下:堆内存得到了释放。

    jvm调优入门学习之堆内存
     
  3. jconsole工具的使用:

    还是运行上面的代码,然后在terminal中执行jconsole命令,选中我们自己的类名并双击,然后选择不安全连接即可。

    jvm调优入门学习之堆内存

    jvm调优入门学习之堆内存
     
  4. 案列:执行垃圾回收后占用还是特别高

    执行如下代码并使用  jmap 命令分析:

    jvm调优入门学习之堆内存

    执行 jmap 命令会发现:Eden区占用了32MB,old区占用了170MB

    jvm调优入门学习之堆内存

    使用jconsole命令来执行一次垃圾回收:会发现堆内存的占用已经下降了,但是仍然有200多MB

    jvm调优入门学习之堆内存

    在terminal中执行jvisualvm命令,这也是个可视化工具来监控内存等信息。

    jvm调优入门学习之堆内存

    点击堆dump后在点击查找按钮,会发现有如下的信息

    jvm调优入门学习之堆内存

    点击进入ArrayList查看详细信息如下,会发现集合中存储的是student对象并且有个array数组占用了1MB,则我们可以找出了具体的问题。

    jvm调优入门学习之堆内存