JVM学习总结-自动内存管理机制(1)

一.Java内存区域
1.Java虚拟机运行时数据区
JVM学习总结-自动内存管理机制(1)

2.直接内存
直接内存不是JVM运行时数据区的一部分,也不是JVM规范中定义的内存。本机的直接内存分配不会受到Java堆大小的限制,会受到本机总内存的限制。分配内存时需要考虑各个内存区域的大小,其总和不能大于物理内存限制。
3.对象
1)对象的创建
在类加载检查通过后,虚拟机需要为新生的对象分配内存,对象的实例主要在堆上分配,根据堆内存是否规整分为以下2种分配方式。
第一种:内存规整(已使用内存在一边,未使用的在另一边),采用“指针碰撞”。
第二种:内存杂乱(已使用和未使用的内存混在一起),采用“空闲列表”。
内存规整与否取决于使用的垃圾收集器是否带有压缩整理功能。
2)对象的内存布局
对象在内存的布局分为:对象头,实例数据,对齐填充。如下图:
JVM学习总结-自动内存管理机制(1)
3)对象的访问定位
目前主流的访问方式有使用句柄和直接指针两种。如下图:
通过句柄访问对象:
JVM学习总结-自动内存管理机制(1)
通过直接指针访问对象:
JVM学习总结-自动内存管理机制(1)
两种访问方式比较:通过句柄来访问的最大好处是reference中存储的是稳定的句柄地址,当对象被移动时,只会改变句柄中实例数据的指针,不会改变reference。通过直接指针访问的优势就是访问速度快。

4.OutOfMemoryError异常
产生OutOfMemoryError的溢出类型:
1)Java堆溢出:java对象数量达到最大堆的容量限制。
2)虚拟机栈和本地方法栈溢出:
*:线程请求栈的深度大于虚拟机所允许的最大深度
OutOfMemoryError:扩展栈时无法申请足够的内存空间
3)方法区和运行时常量池溢出:产生的大量类导致方法区溢出
4)本机直接内存溢出:程序中直接或间接的使用了NIO可能导致该溢出