jvm调优入门学习之堆内存
在上一篇中学习了栈内存的调优,现在学习一下堆内存的相关知识。
- 内存溢出
执行如下代码
执行结果为:
接下来我们手动调整堆内存的大小,然后重新执行代码
- 堆内存诊断
有如下代码块:
这里休眠30秒为了方便我们执行jps和jmap命令
当打印完1....后在idea自带的工具terminal中执行jps命令,jps命令的意思是:查看当前系统中有哪些Java进程
发现我们自己创建的Java类的进程id为 30156,在执行 jmap -head 30156有如下结果:
根据结果发现:当前Java代码在堆中的内存占用为4.4MB
等待2....打印结束后在执行一遍 jmap -head 30156,结果如下:会发现堆内存的占用多了10MB。正好是我们创建的
array数组的占用大小
等3.....打印结束后在执行一遍 jmap -head 30156,结果如下:堆内存得到了释放。
- jconsole工具的使用:
还是运行上面的代码,然后在terminal中执行jconsole命令,选中我们自己的类名并双击,然后选择不安全连接即可。
- 案列:执行垃圾回收后占用还是特别高
执行如下代码并使用 jmap 命令分析:
执行 jmap 命令会发现:Eden区占用了32MB,old区占用了170MB
使用jconsole命令来执行一次垃圾回收:会发现堆内存的占用已经下降了,但是仍然有200多MB
在terminal中执行jvisualvm命令,这也是个可视化工具来监控内存等信息。
点击堆dump后在点击查找按钮,会发现有如下的信息
点击进入ArrayList查看详细信息如下,会发现集合中存储的是student对象并且有个array数组占用了1MB,则我们可以找出了具体的问题。