深入了解JVM
JVM的实现需要遵守<Java虚拟机规范>,这是官方提供的规范
Java SE Specifications
所有的虚拟机实现都应该遵守
运行时区域
堆heap
用于存储对象实例,数组实例,日后可能出现值类型的支持
垃圾回收机制主要负责的区域, 又被称为GC堆(Garbage Collected Heap, 翻译成”垃圾堆”挺好)
线程共享
主流垃圾回收算法: 分代回收
- 新生代: 1个eden 2个survivor
- 老年代
- 永久代
可动态扩展
可产生OutOfMemoryError, 无法满足新的内存分配需求时
方法区method area
线程共享
用于存储已被虚拟机加载 的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据
又被称为: Non-Heap非堆
- jdk7之前
hotspot虚拟机, 方法区是用永久代的方式来实现的方法区 - jdk7
字符串常量池,静态变量,从永久代移出 - jdk8
完全废除永久代, 改用元空间, 类型信息移动到元空间中
组成
- 运行时常量池, 存放编译后即确定的常量(符号引用和直接引用都会存), 以及动态产生的常量(例如String.intern())
- 字符串常量池和运行时常量池有什么区别 https://www.jianshu.com/p/0b264df1a2d3
根据虚拟机实现, 是否可动态扩展, 是否可进行垃圾回收
可产生OutOfMemoryError
无法满足新的内存分配需求时
直接内存
直接使用物理内存, 并不是虚拟机的一部分
NIO中的DirectByteBuffer中会保存本机内存的地址, 使用本机内存, 避免在Java对和native内存之间复制数据,可提高性能
此区域受限于本机可用内存大小, 配置参数时, 需考虑堆的扩展, 避免大于物理内存限制, 出现OutOfMemoryError
虚拟机栈vm stack
- 栈帧的组成: 局部变量表 操作数栈 动态链接 方法出口信息
网友评论