JVM学习
2024-03-12 11:24:49 4 举报
AI智能生成
JVM学习
作者其他创作
大纲/内容
类加载过程
Loading(加载)
class文件加载到内存中
双亲委派机制
双亲委派是类加载器查询一个类和加载一个类的过程,类加载分为bootstrap(jdk自带依赖)、<br>extra(jdk可扩展包)、app(应用中加载的类),custom(自定义的class loader),<br>相互关系加载级别以此从高到低。
双亲委派类加载过程为,例如Test.class需要加载到jvm中,首先需要在custom 查询class是否已经存在,<br>如果存在,则加载进入jvm,如果不存在,则继续在app中进行查找,一次类推到extra,bootstrap。<br>如果bootstrap 查找不到,则会发起加载该类操作,bootstrap会以此让extra、app、custom 进行加载这个类,<br>如果custom都没加载到这个class,则系统直接会报classNotFountException。
主要考虑程序的安全,JDK自带基本类型不容易被篡改
子主题
lazy loading
Linking(链接)
Verification(校验)
验证文件是否符合JVM规范
Preparation(准备)
静态成员变量赋默认值
Resolution(解析)
将类、方法、属性等符号引用解析为<br>直接引用,常量池各种符号也能解析为指针、<br>偏移量等内存的直接引用
Initializing(初始化)
调用类初始化代码,给静态成员变量赋初始值
问题整理
自定义类加载器
继承classLoader,重写findClass,先读文件,<br>转化为二进制字节数组,调用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 条评论
下一页