JVM类加载、对象创建、GC
2019-11-04 14:01:28 0 举报
jvm 类加载,对象创建,GC
作者其他创作
大纲/内容
java源文件
不可达。进行第一次标记
效率低,一般不回收
对象是否存活算法
开始进行真正GC
标记-清除
对象实例化流程
对象是否存活
强引用
通过GC Root对象作为起点,向下搜索,如果一个对像到GC Root对象没有引用链,则说明不可达
动态内存分配和垃圾回收相辅相成
哪些内存需要回收
初始化零值
自定义类加载器
标记-整理
1、堆内存进行分配2、指针碰撞 或者空闲列表3、CAS加重试保证线程安全
该对象没有其他对象使用,但是也没法回收
准备
检查工具
双亲委派模型
内存回收
属性动画(activity销毁,动画没有cancel)
对象设置(头部、内容体、对齐填充)
初始化
分配大对象,内存不足
对象的有效信息:定义的各种字类型段等
直接操作字节流,验证字节流是否符合Class文件格式。
调用init方法,按照开发人员的意愿进行初始化
使用句柄访问使用指针访问
启动类加载器(C++实现),虚拟机的一部分
GC停顿
暂停工作线程。获取当前引用快照
Memory Profiler
在每次gc之前,要确保老年代内存区域要大于新生代对象的总和
直接进行清除,产生碎片
什么时候
无法解决循环引用问题
存活对象往一端移动
非静态内部类持有外部内引用(耗时操作)
调用init方法初始化
引用类型
为类变量分配内存(方法区),并设置初始值
内存泄漏
对对象头进行设置:对象是哪个类实例、对象的gc分代年龄、对象哈希码、如何能找到类的元数据信息
对齐填充
是。 直接进行回收
类加载流程
不推荐使用
弱引用
单例,持有context
GC Root
加载字节流
验证字节流
对象回收
分代收集
放入F-Queue队列,由一个低优先级的Finalizer线程去执行finalize()方法,执行完如果还是不可达,则打上第二次标记。如果可达,则进行移除,不回收
对分配的内存空间都初始化零值
扩展类加载器
如何回收
System.gc被调用
遇到new关键字
需要回收对象被静态变量持有
实例数据
否。 第二次标记
推荐使用
实例化对象
资源对象未被关闭
1.废弃常量回收。2.无用类回收。
类加载器分类
解析
class文件
Memory Analyzer
遇到new指令时,检测后面的参数是否能在常量池中定位到一个符号引用,并且检测这个符号引用代表的类是否已经加装,
可达性分析
通过两次标记,确定对象是否存活
进行回收
堆内存
javac命令编译
将常量池的符号引用转化为直接引用
符号引用检查
对象访问定位
引用计数
调用类构造<clinit>方法,跟据开发人员主观计划初始化变量
复制算法
常见内存泄漏
其他类加载器(java语言实现,继承自ClassLoader)
Eedn、Survor空间
1、自身运行数据:哈希码,GC分代年龄,锁状态标志等 2、类型指针:对象指向类元数据的指针
类加载器进行加载
通过回收算法,释放堆内存
对象头
软引用
方法区(永久代)
虚引用
分配担保
一个类加载器收到加载请求,自己不会先去加载,而是交给父加载器加载,如果父加载器无法加载,就自己加载
Leak Canary
1、从本地或网络加载class文件;2、根据字节流的静态存储结构,生成方法区运行时数据结构;3、生成代表这个类的class对象。
虚拟机栈中引用的对象方法区静态属性引用的对象方法区常量引用的对象本地方法栈中引用的对象
应用程序类加载器
内存分配(新生代)
没有覆盖finalize方法,或者finalize已经被执行过
老年代和新生代采用不同算法
收藏
收藏
0 条评论
回复 删除
下一页