深入了解JVM

深入了解JVM

JVM的实现需要遵守<Java虚拟机规范>,这是官方提供的规范
Java SE Specifications
所有的虚拟机实现都应该遵守

运行时区域

堆heap

用于存储对象实例,数组实例,日后可能出现值类型的支持
垃圾回收机制主要负责的区域, 又被称为GC堆(Garbage Collected Heap, 翻译成”垃圾堆”挺好)
线程共享

主流垃圾回收算法: 分代回收

  1. 新生代: 1个eden 2个survivor
  2. 老年代
  3. 永久代

可动态扩展
可产生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

  • 栈帧的组成: 局部变量表 操作数栈 动态链接 方法出口信息

本地方法栈native method stack

程序计数器program counter register

内存模型

CPU缓存
https://www.jb51.net/hardware/cpu/610074.html

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容