代码改变世界

深入理解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