jvm-1
ddatsh
虚拟机
Java 程序以虚拟机为中介,运行于各平台上,实现跨平台的特性
-
Sun Classic JVM,纯解释型 JVM 实现
-
Exact VM
现代高性能虚拟机的雏形
两级即时编译器
编译器和解释器混合工作模式
准确式内存
(虚拟机可以知道内存位置的数据具体类型,reference还是value,GC时准确判断可达 )
-
Sun 收购 Longview Technologies的 HostSpot JVM,成 JDK1.3 及之后的默认虚拟机
热点代码探测
能力 -
BEA JRockit
-
IBM J9
AOT编译
class data sharing
(一些核心类在每个JVM间共享) -
oracle jdk8 的 HostSpot
以前的HotSpot VM与JRockit VM的合并版
JRockit 一些有价值的功能在HotSpot重新实现一遍。移除PermGen、Java Flight Recorder、jcmd等都属于合并项目的一部分
-
Zing VM
gc C4: The Continuously Concurrent Compacting Collector
利用之前收集到的profile数据,引导JVM在启动后快速达到稳定的高性能水平,减少启动后从解释执行到JIT编译的等待时间
找出代码热点到对象分配监控、锁竞争监控等
jvm 内存区域
程序计数器
CPU 每一条指令执行时,自动修改PC至下一条指令的地址
PC对应寄存器
- x86: eip
- ARM:R15
JVM 每线程有自己私有的 PC,存当前执行bytecode地址
若执行的为native方法,则PC的值为undefined
虚拟机栈
与线程同时创建
描述了方法执行的内存模型:
- 存局部变量表
- 操作数栈
- 动态链接
- 方法出口等
栈帧可在系统的堆上分配内存(是系统的Heap而不是Java Heap)
Java虚拟机栈所使用的内存不需要保证是连续的
本地方法栈
HotSpot JVM中Java虚拟机栈和本地方法栈合二为一
堆
各线程共享
,几乎所有对象实例和数组实例都在Java堆上分配
JIT及逃逸分析技术,可优化到栈上分配
GC收集主要区域
内存回收角度来看,分新生代和老年代,再细分可以分为Eden Space,From Survivor Space,To Survivor Space区
方法区
线程共享的,储存每一个类的结构信息,如
-
运行时常量池(runtime constant pool)
-
字段和方法数据
-
构造函数和普通方法的字节码内容
-
还包括一些初始化的时候用到的特殊方法
方法区是堆的逻辑部分
1.7 前:
方法区位于永久代(Permanent Generation,PermGen)
永久代内可能会发生内存泄露或溢出等问题而导致的java.lang.OutOfMemoryError: PermGen
1.7:
字符串常量,符号引用等移出了永久代
- 符号引用迁移至系统堆内存(Native Heap)
- 字符串字面量迁移至Java堆(Java Heap)
Java 8,永久代彻底地移出JVM,取而代之的是元空间(Metaspace)
运行时常量池
class文件中每一个类或接口的常量池表的运行时表示形式,是方法区的一部分,包括若干种不同的常量
常量池表存放编译器生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放
运行时常量池具有动态性,运行期间也可以将新的量放到运行时常量池中,典型的应用是String类的intern方法:
public native String intern()