目录:
(1)堆
(2)堆-内存溢出
(3)堆内存诊断
(4)内存诊断-jvirsualvm
(1)堆
像前面讲过的程序计数器、虚拟机栈、本地方法栈啊,他们都有一些共同的特点,他们都是线程私有的,现在讲的堆和方法区是线程共享的区
(2)堆-内存溢出
堆中的对象看,当没有人在使用的时候,会被垃圾回收机制回收,占用的内存会被释放掉
如果不断的产生对象,而且有人在使用它,意味着这些对象不能当做垃圾,达到一定的数量,就会导致内存被耗尽,导致内存溢出
堆内存溢出暴露的错误:
还可以更改java虚拟机的内存参数:
改小之后再次运行:
(3)堆内存诊断
打开命令行窗口:
使用jsp查看有哪些进程:
使用jmap 查看18756这个进程的内存占用
查看Heap Usage:堆内存占用,查看used的数,数组创建之前6.多
在执行一遍命令:
数组创建之后,used达到16
在执行一遍命令:
垃圾回收之后:
(4)内存诊断-jconsole工具
重新执行一遍:
输入:
就会出来一个图形化界面:
打印2,堆使用情况
打印3:堆使用情况
(4)内存诊断-jvirsualvm
查看进程id:
查看17748的堆内存占用情况:
观看两个used的值,下面的老生代
使用工具执行垃圾回收
发现先生代占用的内存变少了,老生代没变
使用另外一种工具:也是一种图形化界面工具
可以使用堆Dump:抓取堆的当前快照,进一步对详细内容进行分析,这是jsconsole不具备的
把堆的那一时刻堆的内存的信息截取下来了,并且堆里面有哪些类型的对象、每个对象的个数
点击查找
第一个最大
student这个内存占用较高
通过检查发现student对象内存占用较高,而且这个对象是长期使用的,导致垃圾回收没办法回收他们的内存
上一篇:【Java SE】变量的本质
下一篇:数据分析Numpy之布尔索引