JVM结构

简介: JVM可谓是Java语言的重中之重,可以说逢考必问,今天来整理一下

整个虚拟机结构

虚拟机由以下四个部分组成。类加载器、执行引擎、native接口、运行时数据区(堆栈内存这些)这里借用网上的一个图就可以一目了然

image.png

  1. 类加载器,主要复制加载磁盘中的class文件,将文件通过类加载器加载、验证、准备、解析、初始化到内存中。
  2. 运行时数据区,就是我们常见的八股文,堆了栈了相关的
  3. 执行引擎,执行引擎主要用来执行Java生成的字节码,解析/编译成各种cpu 所能执行的二进制指令。简单来说,JVM 中的执行引擎充当了将高级语言翻译为机器语言的译者。



运行时数据区

  • 线程共享
  • 存放new出的对象
  • 静态变量的值
  • 字符串常量池
  • 方法区、永久代(JDK1.8后改为元空间,在直接内存中)
  • 存放常量
  • 字节码文件
  • 线程不共享
  • 本地方法栈
  • 存放native方法(C语音实现的底层方法)
  • 虚拟机栈
  • 存放临时变量
  • 程序计数器
  • 每个线程一块内存,指向当前正在执行的字节码的行号。
  • 如果当前线程是native方法,则其值为null。


JVM内存结构易错点

  • 静态变量存在堆中,变量引用存在方法区,值在堆
  • Java语言只有值传递,子方法中的引用存在栈中,对象存在堆中
  • 常量池存放在堆中
  • JDK1.7之前常量池是存放在永久代(hotspot虚拟机对方发区的实现)中 ,方法区与堆是独立的
  • JDK1.7字符串常量池从永久代中移到了堆内存中,属于堆内存的一部分。
  • JDK1.8移除了永久代并由元空间(metaspace)代替,存放在本地内存(native space)中。并没有对常量池再做变动。即常量池一直在堆中
  • 为什么用元空间替换永久代
  • 元空间在直接内存,最大限度避免oom
  • 在方法中声明的基本数据类型局部变量存储在栈上,在类中声明的基本数据类型存储在堆上


JVM指针压缩

  1. 使用压缩指针可以在64位系统中利用32位的对象引用获得超过4G的内存寻址空间。
  2. Java对象存储存在对齐补充(对象占用的空间必须是8的倍数),后三位都为000,所以将000去掉存储,寻址时通过左移三位恢复
  3. JVM虽然额外的执行了一些位运算但是极大的提高了寻址空间,并且将对象引用占用内存大小降低了一半,节省了大量空间。况且这些位运算对于CPU来说是非常容易且轻量的操作





相关文章
|
1天前
|
存储 Oracle Java
JVM中Class文件结构详解
JVM中Class文件结构详解
79 0
|
6月前
|
存储 Java 编译器
深入理解JVM系列教程(02) - Java内存结构
深入理解JVM系列教程(02) - Java内存结构
151 0
|
8月前
|
Java
JVM学习笔记(一)------基本结构
JVM学习笔记(一)------基本结构
|
1天前
|
存储 前端开发 Java
深入浅出JVM(四)之类文件结构
深入浅出JVM(四)之类文件结构
深入浅出JVM(四)之类文件结构
|
1天前
|
存储 缓存 安全
深度解析JVM世界:JVM内存结构
深度解析JVM世界:JVM内存结构
|
1天前
|
存储 Java 索引
《深入浅出Java虚拟机 — JVM原理与实战》带你攻克技术盲区,夯实底层基础 —— 吃透class字节码文件技术基底和实现原理(核心结构剖析)
《深入浅出Java虚拟机 — JVM原理与实战》带你攻克技术盲区,夯实底层基础 —— 吃透class字节码文件技术基底和实现原理(核心结构剖析)
34 0
|
1天前
|
存储 Java C++
JVM内存模型和结构详解(五大模型图解)
JVM内存模型和结构详解(五大模型图解)
|
1天前
|
存储 Java
JVM整体结构解析
JVM整体结构解析
|
8月前
|
存储 Java
JVM学习笔记(一)—基本结构
JVM学习笔记(一)—基本结构
|
1天前
|
存储 Java 编译器
深入理解JVM - 类文件结构
深入理解JVM - 类文件结构
58 1
http://www.vxiaotou.com