JVM结构整理
2021-11-23 15:13:07 0 举报
JVM结构图整理
作者其他创作
大纲/内容
即时编译器JIT Compiler
通过内存地址寻找具体的值
老年代Old 2/3
getClassLoader
优化器
ServivorTo
应用程序加载器 加载当前应用classpath所有的类
堆Heap(线程共享,主要是存放对象实例和数组。内部会划分出多个线程私有的分配缓冲区)
CPU
.JAVA文件
本地方法接口(JNI Java Native Interface)native关键词就是调用计算机本地方法C
ExtClassLoader(JRE/lib/ext)
加载,初始化
Class Loader
find
详细
常量池避免频繁的创建和销毁对象造成系统性能的浪费
Exact VM(为了解决上一个虚拟机问题,JDK1.2时,sun提供了此虚拟机)
沙箱安全机制,从java1.0的时代开始,本地代码默认受信任,远程代码不被信任所以不能调用本地代码。自从1.6开始,加入权限,域机制。拥有权限的代码域被收到信任
解释器Interprter
加载(将静态class数据加载到方法区中形成可运行的动态数据。同时在堆中生成一个对应的java.lang.class对象作为方法区访问的入口。)
委托
Heap 堆
sun Classic VM(世界第一款商用Java虚拟机,JDK1.4时被淘汰,只提供了解释器)
a3
执行引擎
BOOT跟加载器(最终执行)
扩展类加载器 JREHOME下的lib\\ext 目录下的jar包和class文件。也可以指定目录
boolean、byte、char、short、int.....
hotspot虚拟机(JDK1.3时,HotSpot VM成为默认虚拟机)
及时你自身定义了java.lang.String的类,也是被APP加载器执行。但是最终会在BOOT加载器的rt.jar中找到原本的String类。双亲委派机制
JVM发展
机器指令
双亲委派机制(安全)
分析器
找不到
方法区Method Area(共享内存区域,存储已被虚拟机加载的类信息(类模板)class、常量final、静态变量static、即时编译器编译后的代码等数据。)(常量池:存放编译期生成的各种字面量和符号引用。)
高级语言
链接(将JAVA类的二进制代码合并到JVM的运行状态之中的过程)
代码生成器
javac命令
a2 内存地址:0x11112
找不到抛出异常
Appclass Loader
Class的实例
a.class模板
getclass
堆内存
APP加载器
...........................
把字节码翻译成机器指令
class对象
Eden区
程序计数器PC Register(内存空间小,线程私有。选取下一条要执行的的字节码指令、分支、循环、跳转、异常处理、线程恢复。此内存区域是唯一一个在 Java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域。)
将热点代码缓存起来
Class类模板只有一个 抽象实例可以有N个a1,a2的名字放在栈中a1中的属性都在堆当中
BootstrapClassLoader
a2
类常量池我们写的每一个Java类被编译后,就会形成一份class文件;class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池(constant pool table),用于存放编译器生成的各种字面量(Literal)和符号引用(Symbolic References);每个class文件都有一个class常量池。
JVM 内存结构
AppClassLoader(APP下的class)
验证(确保加载的数据符合JVM规范。)
新生代Young 1/3
IBM J9(市场定位与HotSpot接近,服务器端、桌面应用,嵌入式等多用途VM)
a1 内存地址:0x11111
将请求委托父类
ServivorFrom
a2 内存地址:0x11112nameageaddress
类加载过程
线程隔离数据
准备(正式为类变量分配内存并初始值,内存在方法区中分配。)
虚拟机栈,本地方法栈和程序计数器是不存在垃圾回收属于线程隔离数据。随时调用随时抛出。JVM调优99%都是在调优方法区。
HotSpot常用的虚拟机供应商
本地方法栈Native Method Stacks(本地方法栈为虚拟机使用到的 Native 方法服务)Native关键字:Java诞生那会C和C++横行霸道。Java需要支持调用C的方法才能占领市场。Native主要是与CPU,硬件交互。现在如果需要调用其他语种代码可以使用Socket,http,webservice
类加载请求
.class文件
(了解)沙箱安全机制
GC垃圾回收
虚拟机栈VM Stack(线程私有,生命周期和线程一致。每个方法在执行时都会床创建一个栈帧存储存储局部变量表、操作数栈、动态链接、方法出口信息。直到方法结束。入栈,出栈)
自定义ClassLoader
本地方法库
a1
字符串常量池变化:在JDK6.0及之前版本,字符串常量池是放在Perm Gen区(也就是方法区)中;在JDK7.0版本,字符串常量池被移到了堆中了。至于为什么移到堆内,大概是由于方法区的内存空间太小了。JDK8以后也还是放在了Heap空间中,并没有已到元空间。是什么:在HotSpot VM里实现的string pool功能的是一个StringTable类,它是一个Hash表,默认值大小长度是1009;这个StringTable在每个HotSpot VM的实例只有一份,被所有的类共享。字符串常量由一个一个字符组成,放在了StringTable上。在JDK6.0中,StringTable的长度是固定的,长度就是1009,因此如果放入String Pool中的String非常多,就会造成hash冲突,导致链表过长,当调用String#intern()时会需要到链表上一个一个找,从而导致性能大幅度下降;在JDK7.0中,StringTable的长度可以通过参数指定
Extention ClassLoader
解析(虚拟机常量池中的符号引用替换为直接引用。)
JRockit(世界上最快的JVM,JDK8中,在HOTSPOT的基础上,移植JRockit的优秀特性)
EXT加载器
new 实例化
找不到抛出异常ClassNotFound
汇编语言
JAVA类加载器
Container
高级语言 到 CPU
初始化(执行类构造器clinit()方法的过程(将静态变量和静态语句块合并)虚拟保证一个类的client方法多线程下正确加锁和同步(是否需要初始化会根据其引用类型来定,只有主动引用才会引起类的初始化))
常量池
加载
委托方向
a1 内存地址:0x11111nameageaddress
VM栈
Bootstrap ClassLoader
0 条评论
下一页