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