我们已经知道了JVM的架构主要分为三部分:类加载器,JVM内存结构,执行引擎。
JVM内存结构又分为五部分,这节来简单的看看有关栈知识点。
虚拟机堆:
定义:
- 通过new关键字,创建的对象都会保存在堆中。
特点:
- 堆空间是线程共享的,堆中对象使用要考虑到多线程并发安全问题
- 有垃圾回收机制。
既然通过new关键字创建的对象都会保存在堆内存中,那么这是不是就意味着堆中只有new创建的对象呢?
答案显然是错误的,我们看下图:
new的对象一般来说会放置在堆内存的新生代中,当然也可能会被直接放置在老年代当中,另外堆内存还有常量池,字符串常量池和运行时常量池等区域。
所以,并不是堆中只有new创建的对象。
虚拟机栈和堆的关系:
堆内存溢出:
我们通过上面的介绍了解了什么是堆,栈在使用的时候可能会存在许多问题,其中最常见的便是堆内存溢出,所谓的堆内存溢出是指,堆内存不够使用导致出现错误。
导致栈内存溢出的方式:new对象多且没有被GC回收
我们可以使用参数 -Xmx 去调整JVM堆的大小。(默认20M堆内存)
new对象过多导致堆内存溢出:
堆内存诊断:
- jps工具 :查看当前系统有哪些java进程
- jmap工具:查看堆内存占用情况
- jconsole工具:图形界面,可以连续监测
- jvisualvm工具:图形界面,可以连续监测,可以dump堆数据,比jconsole工具功能更加丰富。
前面两种工具是控制台查看堆内存工具,使用的第三种jconsole图形化界面工具。
前面两种工具是控制台查看堆内存工具,使用的第四种jconsole图形化界面工具。