GC相关面试题

更新时间:2023-07-12 23:09:00 阅读: 评论:0

GC相关⾯试题
GC相关⾯试题
⽂章⽬录
x天x地的成语杨梅汁Object的finalize()⽅法的作⽤是否与C++的析构函数作⽤相同?
与C++的析构函数不同,析构函数确定调⽤,⽽它是不确定的
当垃圾回收器宣告⼀个对象死亡时,⾄少要经过两次的标记过程,如果对象在可达性分析够发现对象没有与GCRoot连接的引⽤链,就会被第⼀次标记。并且判断是否执⾏finalized()⽅法,如果对象覆盖finzlize⽅法并且未被应⽤过这个对象就会被放置在F-Queue队列中。并在稍后有⼀个虚拟机建⽴的⼀个低优先级的finalize去执⾏触发finalize⽅法。由于优先级太低,⽅法执⾏随时可能被中⽌。
finalize⽅法的作⽤是为对象提供最后⼀次逃脱死亡的机会。
由于finalize⽅法的运⾏不确定性较⼤,⽆法保证各对象的调⽤顺序。同时运⾏代价⼗分⾼昂,所以不建议使⽤。
为什么不能显⽰直接调⽤finalize⽅法?
finalize⽅法在垃圾回收时⼀定会被执⾏,⽽如果在此之前显⽰执⾏的话,也就是说finalize会被执⾏两次以上,⽽在第⼀次资源已经被释放,那么在第⼆次释放资源时系统⼀定会报错,因此⼀般finalize⽅法的访问权限和⽗类保持⼀致,为protected。
Java中的强引⽤,软引⽤,弱引⽤,虚引⽤有什么⽤?
强引⽤(Strong Reference):
1. 最普遍的引⽤:Object obj = new Object();
森林破坏2. 当对象为强引⽤时,并且内存不⾜时,Java宁可抛出OOM异常也不会回收具有强引⽤的对象。
3. 如果我们不实⽤这个对象了,我们可以通过将对象设置为Null来弱化引⽤,使其被回收。或者等待超出它的⽣命周期范围。这时GC就
会认为不存在该对象的引⽤,就会将其回收。
软引⽤(Soft Reference):
1. 对象处于有⽤但⾮必须状态
奥特曼画画图片2. 只有当内存空间不⾜时,GC会回收该引⽤的对象的内存
3. 可以⽤软引⽤来实现⾼速缓存
4. String str = new String("abc"); // 强引⽤
SoftReference<String> softref = new SoftReference<String>(str); // 软引⽤
弱引⽤(Weak Reference):
1. ⾮必须的对象,⽐弱引⽤更弱⼀些
2. GC时会被回收
3. 被回收的概率也不⼤,因为GC的线程优先级⽐较低
4. 适⽤于引⽤偶尔被使⽤且不影响垃圾收集机制的对象
5. String str = new String("abc"); // 强引⽤
WeakReference<String> weakref = new WeakReference<String>(str); // 软引⽤
虚引⽤(PhantomReference):
1. 不会决定对象的⽣命周期
2. 任何时候都可能被垃圾回收器回收
3. 跟踪对象被垃圾收集器回收的活动,其哨兵作⽤
4. 必须和应⽤队列ReferenceQueue联合使⽤
5. String str =new String("abc");
RegerenceQueue queue =new RegerenceQueue();
PhantomReference ref =new PhantomReference(str,queue);
GC是在什么时候,对什么东西,做了什么事情?
什么时候
1. 系统⾃⾝决定,不可预测的时间/调⽤()的时候。
2. 新⽣代、⽼年代结构,提出minor gc/full gc
3. 说明minor gc/full gc的触发条件、OOM的触发条件,降低GC的调优的策略。
4. eden满了minor gc,升到⽼年代的对象⼤于⽼年代剩余空间full gc,或者⼩于时被HandlePromotionFailure参数强制full gc;gc
与⾮gc时间耗时超过了GCTimeRatio的限制引发OOM,调优诸如通过NewRatio控制新⽣代⽼年代⽐例,通过
MaxTenuringThreshold控制进⼊⽼年前⽣存次数等
总结:程序员不能具体控制时间,系统在不可预测的时间调⽤()函数的时候;当然可以通过调优,⽤NewRatio控制newObject 和oldObject的⽐例,⽤MaxTenuringThreshold 控制进⼊oldObject
的次数,使得oldObject 存储空间延迟达到full gc,从⽽使得计时器引发gc时间延迟OOM的时间延迟,以延长对象⽣存期。
对什么东西?
1. 从gc root开始搜索,搜索不到的对象
2. 从root搜索不到,⽽且经过第⼀次标记、清理后,仍然没有复活的对象
总结:超出了作⽤域或引⽤计数为空的对象;从gc root开始搜索找不到的对象,⽽且经过⼀次标记、清理,仍然没有复活的对象。
做什么?
1. 删除不使⽤的对象,腾出内存空间。
2. 停⽌其他线程执⾏、运⾏finalize等
3. 新⽣代做的是复制清理、from survivor、to survivor是⼲啥⽤的、⽼年代做的是标记清理、标记清理后碎⽚要不要整理、复制清理
童年故事梗概
和标记清理有有什么优劣势
4. 清楚串⾏、并⾏(整理/不整理碎⽚)、CMS等搜集器可作⽤的年代、特点、优劣势,并且能说明控制/调整收集器选择的⽅式。
总结:删除不使⽤的对象,回收内存空间;运⾏默认的finalize,当然程序员想⽴刻调⽤就⽤dipo调⽤以释放资源如⽂件句柄,JVM⽤from survivor、to survivor对它进⾏标记清理,对象序列化后也可以使它复活。
Java虚拟机规范将JVM虚拟机所管理的内存分为⼏部分?
1. 程序计数器(Program Counter Register)
是⼀块较⼩的内存空间,它的作⽤可以看做是当前线程所执⾏字节码的⾏号指⽰器。是线程私有,⽣命周期与线程相同。
2. Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的⽣命周期与线程相同。
Java虚拟机栈描述的是Java⽅法(区别于native的本地⽅法)执⾏的内存模型:每个⽅法被执⾏的时候都会同时创建⼀个栈帧(Stack Frame)⽤于存储局部变量表、操作栈、动作链接、⽅法出⼝等信息。每个⽅法被调⽤直⾄执⾏完成的过程,就对应着⼀个栈帧在虚拟机栈中从⼊栈到出栈的过程。思念的诗
3. 本地⽅法栈(Native Method Stacks)
与虚拟机栈所发挥的作⽤是⾮常相似的,其区别不过是虚拟机栈为虚拟机执⾏Java⽅法(也就是字节码)服务,⽽本地⽅法栈则为虚拟机所使⽤到的Native⽅法服务。
4. ⽅法区
有哪些⽅法可以判断⼀个对象已经可以被回收,JVM怎么判断⼀个对象已经消亡可以被回收?
①引⽤计数算法
给对象中添加⼀个引⽤计数器,每当有⼀个地⽅引⽤它时,计数器就加1;当引⽤失效时,计数器值就减1;任何时刻计数器都为0的对象就是不可能再被使⽤的。
光歌词Java语⾔没有选⽤引⽤计数法来管理内存,因为引⽤计数法不能很好的解决循环引⽤的问题。
②根搜索算法
在主流的商⽤语⾔中,都是使⽤根搜索算法来判定对象是否存活的。
GC Root Tracing 算法思路就是通过⼀系列的名为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索所⾛过的路径称为引⽤链(Reference Chain),当⼀个对象到GC Roots没有任何引⽤链相连,即从GC Roots到这个对象不可达,则证明此对象是不可⽤的。
⽐如上图,左边的对象都是存活的,右边的都是可以回收的。哪些对象可以作为GC Roots?
硬盘接线1. 虚拟机栈(栈帧中的本地变量表)中的引⽤的对象
2. ⽅法区中的类静态属性引⽤的对象
3. ⽅法区中的常量引⽤的对象
4. 本地⽅法栈中JNI(Native⽅法)的引⽤对象

本文发布于:2023-07-12 23:09:00,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1093307.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:对象   回收   垃圾   搜索   时间   控制
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图