jvm的基础知识
1:jvm的内存分区,具体到每个区存放什么
Q:字节码指令和字节码解释器
Q:androd4.4前后使用的是什么虚拟机?
Q:class文件是什么?所含信息有哪些?
- 程序计数器
- 是概念模型,在真正的jvm中其功能可能会以更高效的方式实现
- 字节码计时器就使用程序计数器来指向下一条“字节码指令”
- 线程私有,每个线程均有一个
- 唯一一个没有内存溢出Error的区域
- 对于java方法,记录字节码指令的地址;native方法,其值为空
- VM 栈
- 线程私有
- 它描述方法的内存模型:每个方法在执行的同时会创建一个“栈帧”(stack frame)用于存储局部变量表、操作数栈、方法出口动态链接等
- 其中局部变量表存储7种基本数据类型数据和引用类型数据(reference),某种程度上来说vm的栈区就特指vm栈的局部变量表
- double/long两种数据类型数据占用2个“局部变量空间”
- 可能会发生栈溢出和内存溢出Error
- 本地方法栈
- 针对native方法
- 在某些vm中该栈与vm栈合并
- 对于实现方式(数据结构、语言、使用方式)没有硬性规定
- 可能会发生栈溢出和内存溢出Error
- 堆(Heap)
- 用于存放对象实例,是GC的主要回收对象
- 线程共享
- 物理内存可以不连续,逻辑上连续即可
- 可能会发生内存溢出Error
- 方法区
- 存放已经被类加载的“类信息”、“常量”、“静态变量”、“即时编译器编译后的代码”
- 线程共享
- GC回收在此处较少见
- 逻辑上是heap的一部分但是又叫做“non-heap”,以示与heap的区别
- 可能会发生内存溢出Error
- 运行时常量池
- 是方法区的一部分
- “常量池”是class文件的一部分,用于存放“字面量”和“符号引用”
- 运行时常量池相对于常量池,具有动态性的特点,在运行时也可以将新的常量放入池中