深入理解Java虚拟机1-chap1-2-斗之气8段
2019-03-02 17:22 剑动情缥缈 阅读(208) 评论(0) 收藏 举报1.HotSpot VM:热点代码探测能力,与JIT技术共同进行编译优化,输出高质量代码
2.运行时数据区域

- 程序计数器:控制程序执行顺序,无OOM
- Java虚拟机栈:生命周期与线程一致,描述Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储 局部变量表、操作数栈、动态链接、方法接口等信息
OOM情况:(1)线程深度:线程请求的栈深度>虚拟机所运行的最大深度;(2)线程大小:虚拟机动态扩展时无法申请到足够的内存

- 本地方法栈:本地方法栈则为虚拟机所使用的Native方法服务
此区域会抛StackOverflowError 和 OutofMemoryError异常

- Java堆区:用于存放对象实例,可能会单独为线程分配私有缓冲区(TLAB)
OOM:无内存可以扩展

- 方法区:存储已经被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。
可能被称为永久代,但是这种处理方式已被Native Memory取代
GC很少,主要是针对常量池的回收和类型的卸载
- 运行时常量池:方法区的一部分
Class文件除了类的版本、字段、方法、接口等描述信息外,还有一项存储编译器生成的各种字面量和符号引用的常量池
支持动态性,运行时可以将新的常量放入池中
OOM:无法申请内存

- 直接内存:
非虚拟机运行时数据区的一部分,但是可能有OOM异常
NIO:基于Channel与Buffer,使用Native函数库直接分配内存,提高性能
3.HotSpot VM
- 对象创建过程

- 对象的内存布局:三种类型
对象头:运行时数据(如哈希码、GC分代年龄、线程持有的锁等)与类型指针(执行类元数据,JVM通过这个指针确定对象实际类型)
实例数据:类所预定义的各种类型的字段内容
对其填充:字节对齐
- 对象的访问定位:两种方法
句柄访问:引用中存放的是稳定的句柄地址,对象移动时,只需要改变句柄中实例数据的指针即可

指针访问:更快,通过引用直接访问对象实例数据,解决了一次指针定位的开销

4.实战异常
5.参考
https://blog.csdn.net/lin74love/article/details/81167761
https://juejin.im/entry/5ba1a379e51d450e70426a2a
浙公网安备 33010602011771号