JVM 框 架 解 析(1)
2020-11-13 17:03:54 0 举报
JVM框架解析
作者其他创作
大纲/内容
存在垃圾回收(调优区GC)线程共享
准备(prepare)
JAVA本地方法接口(JNI)Native Method Interface
执行引擎Execution Engine
当Java虚拟机启动时会根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容“翻译”为对应平台的本地机器指令执行。
方法区Method Area
非堆内存用途:永久代,也称为方法区,存储程序运行时长期存活的对象,比如类的元数据、方法、常量、属性等。
就是虚拟机将源代码直接编译成和本地机器平台相关的机器语言
而本地方法栈则为虚拟机使用到的本地(Native)方法服务。也会有 StackOverflowError 和OutOfMemoryError 异常。
运行时常量池:属于方法区一部分,用于存放编译期生成的各种字面量和符号引用。编译器和运行期(String 的 intern() )都可以将常量放入池中。内存有限,无法申请时抛出 OutOfMemoryError。
一个类诞生成长,甚至死亡的地方
属于共享内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
方法区(Method Area)
连接(Linking)
解析器Interpreter
loader加载(分区存储待使用)
ToSpace
堆区Heap
当前线程执行的行号提示器
线程私有,生命周期和线程一致。描述的是 Java 方法执行的内存模型:每个方法在执行时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行结束,就对应着一个栈帧从虚拟机栈中入栈到出栈的过程。
机械相关优化
堆区(Heep)
寄存器分配器
编译Class File
虚拟机栈VM Stack
永久代(Permanent Generation)
程序计数器(pc存储器)Program Counter Register
JVM执行Java方法(也就是字节码)服务
垃圾回收器GC
HotSpot把本地方法栈和虚拟机栈合二为一
中间代码
这个部分也是用来优化性能的,当某些method被多次使用时,Hotspot这个部分就会用profiler去记录那些method所对应的native code, 这样就可以直接用native code而不是byte code了。
存放的是对象,垃圾收集器就是收集这些对象,然后根据GC算法回收。
Class loader SubSystem(类加载子系统器)
JVM字节码
所有对象都是在这里new出来的
启动/引导类加载器(BootStrap ClassLoader)C++
本地方法栈(Native Method Stack )
JIT编译器
Class loader SubSystem(类加载子系统器)
验证(Verify)
本地方法库Native Method Library
老年代(Old Generation)
不会有垃圾回收线程私有
如果想让一个Java程序运行起来、执行引擎的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以。简单来说,JVM中的执行引擎充当了将高级语言翻译为机器语言的译者。
本地方法栈Native Method Stack
FromSpace
运行时数据区(data areas)JRE
JVM内存
本地方法接口Native Method Interface
java代码
机械无关优化
幸存区(Survivor)
目标代码生成器
解析(Resolve)
初始化(Initialization)
FromSpace与ToSpace(是一个位置概念) 会交换,谁空谁是ToSpace
目标代码
生成区(Eden)
年轻代(Young Generation)
内存空间小,线程私有。字节码解释器工作是就是通过改变这个计数器的值来选取下一条需要执行指令的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器完成。
JVM 框 架 解 析
JIT编译器(即时编译器(Just In Time Compiler))
虚拟机栈(VM Stack)
应用/系统类加载器(Application ClassLoader) java
如果线程正在执行一个 Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是 Native 方法,这个计数器的值则为 (Undefined)。此内存区域是唯一一个在 Java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域。
四大算法:(实现方法:单线程,并行,并发)标记清除法: 算法分为标记和清除两个阶段。标记就是把所有活动对象都做上标记的阶段;清除就是将没有做上标记的对象进行回收的阶段。标记整理法(老年代):标记-压缩算法与标记-清理算法类似。 复制算法(新生代): 复制算法就是将内存空间按容量分成两块。当这一块内存用完的时候 ,就将还存活着的对象复制到另外一块上面,然后把已经使用过的这一块一次清理掉 。引用计数法:没有被Java所使用的,但是python有使用到它。
加载 (Loading)
扩展类加载器(Extension ClassLoader)java
热点分析器(Hotspot profiler)
收藏
收藏
0 条评论
下一页