JVM组成(类加载器/运行时数据区)
2021-02-26 15:04:53 0 举报
AI智能生成
JVM组成(类加载器/运行时数据区)
作者其他创作
大纲/内容
四大组成
类加载器
运行时数据区
执行引擎
本地库接口
类加载器
种类
启动类加载器:Bootstrap Classloader
加载 JAVA_HOME/jre/lib 下的核心类库
扩展类加载器:Extension ClassLoader
加载 JAVA_HOME/jre/lib/ext 下的jar文件
系统类加载器:Application ClassLoader(应用类加载器)
加载 classpath 下的文件
自定义类加载器:必须继承 ClassLoader
负责加载用户自定义路径下的类包
作用
将类的字节码文件从JVM外部加载到内存中
确定一个类的唯一性
提供隔离特性,为中间件开发者提供便利(例如Tomcat)
运行时数据区
直接内存(堆外内存/元空间)不属于运行时数据区(用于NIO、Unsafe、JNI)
程序计数器
线程私有,实现流程控制 和 记录执行位置
如果当前正在执行的是本地方法则程序计数器为空
虚拟机栈
描述Java方法执行的内存模型,每个方法在执行的同时都会创建一个线帧,线程私有
每个方法从调用到执行完成,都对应着一个线帧在虚拟机栈中从入栈到出栈的过程
用于存储
局部变量表
用来存放Java方法中局部变量的空间
如果变量是对象,则只存放地址
操作数栈
给变量赋值的操作数做加减运算的临时空间
动态链接
把符号引用转换为直接引用
方法出口
存储运行方法前的执行位置
本地方法栈
线程私有
本地方法栈与虚拟机栈类似,只不过虚拟机栈是为Java方法提供服务,本地方法栈是为native方法服务
堆
线程共享,虚拟机启动时创建
占内存最大的一块
存放对象实例
GC的主要区域
新生代(1/3)
Eden : Survivor (from | to)
Eden : s0 : s1 = 8:1:1
老年代(2/3)
方法区/元空间
(线程共享)
(线程共享)
存储已被虚拟机加载的 类信息、常量、静态变量、即时编译器编译后的代码 等数据
元空间在1.8中不再与堆是连续的物理内存,而是改为使用本地内存(Native memory)
方法区
方法区是规范,永久代/元空间是实现
永久代和元空间的区别?
方法区在jdk1.8以前叫永久代,jdk1.8开始叫元空间
永久代是存放在堆区的,元空间存在于直接内存
为什么要移除永久代?
为了避免发生OOM异常,替换成元空间不占用堆内存
元空间的调优
最小、最大元空间设置成一样大
大小设置为物理内存的 1/32
预留20%-30%的空间
3种常量池
点击跳转 👉
执行引擎
执行字节码的方式
字节码解释器
Java字节码 -> c/c++代码 -> 硬编码(机器码)
模板解释器
Java字节码 -> 硬编码(机器码)
底层原理
1、将new方法的硬编码拿过来
2、申请一块可读可写可执行的内存
3、将硬编码写入这块内存
4、声明一个函数指针指向这块内存
5、通过这个函数指针调用这块内存
2、申请一块可读可写可执行的内存
3、将硬编码写入这块内存
4、声明一个函数指针指向这块内存
5、通过这个函数指针调用这块内存
执行字节码的模式
-Xint:纯字节码解析器运行(interpreted mode)
-Xcomp:纯模板解释器运行(compiled mode)
-Xmixed:默认混合模式(mixed mode)
本地库接口
0 条评论
下一页