JVM结构整理

本文详细介绍了Java虚拟机(JVM)的组成与工作原理,包括类加载器、运行时常量区、执行引擎等关键组件的功能与作用。此外还探讨了JVM的内存管理机制及其垃圾回收策略。

JVM

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。当执行class命令时,即启动了一个JVM实例。 
在JVM specification中没有明确的JVM构成图,从网上摘抄了最流行的结构图如下,主要包括类加载器(ClassLoader),运行时数据区(Run-time Data Area),执行引擎(Execution Engine)。JVM 框架由类加载器加载二进制文件,然后执行引擎在内存中处理这些二进制编码,与异构系统交互通过JNI进行。


1.ClassLoader

JVM本身包含了一个ClassLoader称为Bootstrap ClassLoader。和JVM一样,Bootstrap ClassLoader是用本地代码实现的,它负责加载核心JavaClass(jre/lib目录下的类)。另外JVM还会提供两个ClassLoader,它们都是用Java语言编写的,由Bootstrap ClassLoader加载;其中Extension ClassLoader负责加载扩展的Javaclass(jre/lib/ext目录下的类),Application ClassLoader负责加载应用程序自身的类。

2.Run-time Data Area

运行时常量区分为6部分,其中PC程序寄存器、JVM栈、本地方法栈,在每个线程创建时为每个线程创建。堆、方法区、运行时常量池由所有线程共享,在JVM启动时创建。

2.1 PC Register

每个线程都有一个程序计数器,就是一个指针,指向方法区中的方法字节码,由执行引擎读取下一条指令。

2.2 Stack

栈中的数据都是以栈帧( Stack Frame )的格式存在。栈帧中主要保存3 类数据:本地变量(Local Variables ),包括输入参数和输出参数以及方法内的变量;栈操作(Operand Stack ),记录出栈、入栈的操作;栈帧数据(Frame Data ),包括类文件、方法等等。当一个函数执行时产生一个栈帧,并压入栈中,执行完毕后弹栈。

2.3 Native Method Stack

用于执行通过JNI接口调用的非Java代码的堆栈。

2.4 Heap

存储Java程序创建的类实例,所有线程共享。其大小可以通过-Xmx和-Xms来控制。堆被划分为新生代和旧生代,新生代又被进一步划分为Eden和Survivor区,最后Survivor由FromSpace和ToSpace组成。新建的对象都是用新生代分配内存,Eden空间不足的时候,会把存活的对象转移到Survivor中,新生代大小可以由-Xmn来控制,也可以用-XX:SurvivorRatio来控制Eden和Survivor的比例。旧生代存放新生代中经过多次垃圾回收仍然存活的对象。 
JVM分别对新生代和旧生代采用不同的垃圾回收机制。

2.5 Method Area

存放了要加载的类信息、静态变量、final类型的常量、属性和方法信息。JVM用持久代(PermanetGeneration)来存放方法区,可通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值。

2.6 Run-time Constant Pool

方法区内部有一个非常重要的区域,叫做运行时常量池(Runtime Constant Pool,简称 RCP)。在字节码文件中有常量池(Constant Pool Table),用于存储编译器产生的字面量和符号引用。每个字节码文件中的常量池在类被加载后,都会存储到方法区中。值得注意的是,运行时产生的新常量也可以被放入常量池中,比如 String 类中的 intern() 方法产生的常量。

Execution Engine

执行引擎将classloader加载的二进制文件,翻译成JVM操作指令码并执行。

内存管理

对象及数组不会被显示释放,垃圾回收器会自动回收它们。此过程如下:

  1. 新的对象和数组被创建并放到年轻代中;
  2. 一次小的垃圾收集会在年轻代上执行,如果对象存活下来,则它们将被从eden空间移动到survivor空间;
  3. 主垃圾收集(Major)执行,它会引起应用线程停止运行,也即stop-the-world,同时会在不同的“代”中移动对象。经过此次垃圾回收后,如果对象仍然存活,则它们会被从年轻代移动到老年代。
  4. 在每次老年代被回收时永久代也被回收,当任何一个空间满时,它们都会被回收。

参考文件: 
1. http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals/ 
2. http://www.cnblogs.com/redcreen/archive/2011/05/04/2036387.html 
3. http://thw.iteye.com/blog/953869

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值