jvm-1

ddatsh

dev #java #jvm

虚拟机

Java 程序以虚拟机为中介,运行于各平台上,实现跨平台的特性

  1. 两级即时编译器
  2. 编译器和解释器混合工作模式
  3. 准确式内存(虚拟机可以知道内存位置的数据具体类型,reference还是value,GC时准确判断可达 )

jvm 内存区域

 
程序计数器

CPU 每一条指令执行时,自动修改PC至下一条指令的地址

PC对应寄存器

JVM 每线程有自己私有的 PC,存当前执行bytecode地址

若执行的为native方法,则PC的值为undefined

 
虚拟机栈

与线程同时创建

描述了方法执行的内存模型:

栈帧可在系统的堆上分配内存(是系统的Heap而不是Java Heap)

Java虚拟机栈所使用的内存不需要保证是连续的

 
本地方法栈

HotSpot JVM中Java虚拟机栈和本地方法栈合二为一

 

各线程共享,几乎所有对象实例和数组实例都在Java堆上分配

JIT及逃逸分析技术,可优化到栈上分配

GC收集主要区域

内存回收角度来看,分新生代和老年代,再细分可以分为Eden Space,From Survivor Space,To Survivor Space区

 
方法区

线程共享的,储存每一个类的结构信息,如

1.7 前:

方法区位于永久代(Permanent Generation,PermGen)

永久代内可能会发生内存泄露或溢出等问题而导致的java.lang.OutOfMemoryError: PermGen

1.7:

字符串常量,符号引用等移出了永久代

Java 8,永久代彻底地移出JVM,取而代之的是元空间(Metaspace)

 
运行时常量池

class文件中每一个类或接口的常量池表的运行时表示形式,是方法区的一部分,包括若干种不同的常量

常量池表存放编译器生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放

运行时常量池具有动态性,运行期间也可以将新的量放到运行时常量池中,典型的应用是String类的intern方法:

public native String intern()