学习JVM的个人理解以及总结--垃圾收集器与内存分配策略

虚拟机栈,程序计数器,本地方法栈随线程的生和死而决定,垃圾收集一般不考虑这个区域。引用计数算法当其他对象引用它时,计数器就加1,引用失效就减去1.但是存在一个缺陷,就是互相引用后让两个对象不再被访问时,导致计数器不为0.

可达性算法分析,可以作为GC Roots的对象包括:虚拟机栈(栈帧中的本地变量表)中引用的对象。方法区中类静态属性引用的对象。方法区中常量的引用对象。本地方法栈中JNI引用的对象。

强引用指的是“Object() a = new Object()”只要强引用还存在,垃圾收集器就不会回收掉这类引用。

一个对象是否必死需要经过两次标记过程,第一次判断是否为GC Roots可达,没有引用链的话会被标记一次并进行筛选,筛选条件是判断次对象有没有必要执行finalize()方法,如果没有覆盖finalize()方法,或者虚拟机已经调用过finalize()方法,则判定为没有必要执行。如果判断为有必要执行,就被被放置在一个F-Queue队列之中。虚拟机会自动建立一个低优先级的Finalize线程去执行finalize()方法。任何一个对象的finalize()方法都只会被系统调用一次。

判断方法区中是否为一个无用的类需要满足3个条件:

1.该类的所有实例已经被回收,也就是java堆中不存在该类的任何实例。

2.加载该类的ClassLoader已经被回收。

3.该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

在大量使用反射,动态代理,GCLib等ByteCode框架,动态生成JSP以及OSGi这类频繁自定义ClassLoader的场景都需要虚拟机具备卸载的功能,保证永久带不会溢出。

标记清楚算法的标记和清楚过程效率较低,还有一个问题是在清楚后会产生大量不连续的内存碎片。空间碎片太多会导致在需要分配一块较大的内存时无法找到足够的连续碎片,需要提前触发一次垃圾收集动作。

复制算法,将内存划分为两个大小相等的区域,将存活对象在另一块区域移动堆顶指针,按顺序复制分配过去,然后一次清理原来那块的内存。新生代中98%的对象存活时间很低。不需要按1:1进行内存区域的划分


parallel Scavenge和Parallel old通过提高吞吐量来提高效率。

CMS和G1通过减少停顿时间,CMS过程初始标记,并发标记,重新标记,并发清楚。G1初始标记,并发标记,最终标记,筛选回收。

利用 TensorFlow 训练自己的目标识别器。本文内容来自于我的毕业设计,基于 TensorFlow 1.15.0,其他 TensorFlow 版本运行可能存在问题。.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值