jvm-1

发布于
java jvm

虚拟机

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

  • Sun Classic JVM,纯解释型 JVM 实现

  • Exact VM

现代高性能虚拟机的雏形

  1. 两级即时编译器
  2. 编译器和解释器混合工作模式
  3. 准确式内存(虚拟机可以知道内存位置的数据具体类型,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()