JVM学习
2024-03-12 11:24:49 4 举报
AI智能生成
JVM学习
作者其他创作
大纲/内容
类加载过程
Loading(加载)
class文件加载到内存中
双亲委派机制
双亲委派是类加载器查询一个类和加载一个类的过程,类加载分为bootstrap(jdk自带依赖)、
extra(jdk可扩展包)、app(应用中加载的类),custom(自定义的class loader),
相互关系加载级别以此从高到低。
extra(jdk可扩展包)、app(应用中加载的类),custom(自定义的class loader),
相互关系加载级别以此从高到低。
双亲委派类加载过程为,例如Test.class需要加载到jvm中,首先需要在custom 查询class是否已经存在,
如果存在,则加载进入jvm,如果不存在,则继续在app中进行查找,一次类推到extra,bootstrap。
如果bootstrap 查找不到,则会发起加载该类操作,bootstrap会以此让extra、app、custom 进行加载这个类,
如果custom都没加载到这个class,则系统直接会报classNotFountException。
如果存在,则加载进入jvm,如果不存在,则继续在app中进行查找,一次类推到extra,bootstrap。
如果bootstrap 查找不到,则会发起加载该类操作,bootstrap会以此让extra、app、custom 进行加载这个类,
如果custom都没加载到这个class,则系统直接会报classNotFountException。
主要考虑程序的安全,JDK自带基本类型不容易被篡改
子主题
lazy loading
Linking(链接)
Verification(校验)
验证文件是否符合JVM规范
Preparation(准备)
静态成员变量赋默认值
Resolution(解析)
将类、方法、属性等符号引用解析为
直接引用,常量池各种符号也能解析为指针、
偏移量等内存的直接引用
直接引用,常量池各种符号也能解析为指针、
偏移量等内存的直接引用
Initializing(初始化)
调用类初始化代码,给静态成员变量赋初始值
问题整理
自定义类加载器
继承classLoader,重写findClass,先读文件,
转化为二进制字节数组,调用defindClass转化为class
转化为二进制字节数组,调用defindClass转化为class
类加载过程乱序处理
cpu为了提高指令执行效率,会在一条指令执行过程中,去同时执行另外条指令
类加载过程可能会出现加载、校验、准备、初始化、解析,这样可能会导致线程使用成员变量值为默认值
class文件结构
magic number(魔术)
占用四个字节
CA FE BA BE
minor version
占用两个字节
java最低版本
major version
占用两个字节
java最高版本
constant_pool_count
占用两个字节
常量池大小 可以表示2^16
constant_pool
常量池
access_flags
类文件方法修饰符
this_class
super_class
GC
基本知识点
程序的栈
每个线程一个栈,方法结束自动释放
堆
程序执行时候动态分配内容空间
什么是垃圾
没有引用指向
如何定位垃圾
reference counting(引用计数法)
应用计数为0时就是垃圾,引用一次计数器加1,计数为0时被定位为垃圾
缺点
垃圾相互引用,计数器不为0,造成内存空间浪费
root searching(根可达算法)
从主函数一次寻找引用,如果内存空间没有在引用里面,则为垃圾
java 垃圾定位
根包含什么
线程栈变量、静态变量、常量池(常量池引用其他变量)、JNI指针(c,c++的引用)
垃圾清除算法
Mark-Sweep(标记清除)
找到垃圾,标记清除
缺点
碎片化以较严重
优点
算法比较简单
使用场所
使用于存活对象比较多的情况
copying(拷贝)
找到引用空间,复制到新的内存空间
缺点
浪费内存
使用场所
适用于存活对象比较少的情况
Mark-Compact(标记压缩)
找到引用内存空间,整理内存空间
缺点
效率低
垃圾回收器
内存分代
新生代
程序刚产生的内存空间
老年代
新生代垃圾回收几次,没有回收掉的对象放在老年代
永久代
java7 perm Generation/java8 元数据区 Metaspace
垃圾回收空间划分
垃圾回收空间划分图
对象分配过程
对象分配过程
0 条评论
下一页