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操作指令码并执行。
内存管理
对象及数组不会被显示释放,垃圾回收器会自动回收它们。此过程如下:
- 新的对象和数组被创建并放到年轻代中;
- 一次小的垃圾收集会在年轻代上执行,如果对象存活下来,则它们将被从eden空间移动到survivor空间;
- 主垃圾收集(Major)执行,它会引起应用线程停止运行,也即stop-the-world,同时会在不同的“代”中移动对象。经过此次垃圾回收后,如果对象仍然存活,则它们会被从年轻代移动到老年代。
- 在每次老年代被回收时永久代也被回收,当任何一个空间满时,它们都会被回收。
参考文件:
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

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

被折叠的 条评论
为什么被折叠?



