腾讯面试:Java对象存在JVM堆中的具体什么区域?

腾讯面试题,场景是这样的:面试官先问了JVM GC手段,我说了Root可达性分析法,然后面试官又问:按你说的,Root可达性分析法需要扫描所有对象,以确定哪些对象是和GC Roots连在一起的,哪些对象是独立的,那些独立的对象就是需要被回收的垃圾对象,对吧?那如何实现“扫描所有对象”这个操作呢?所有被创建的对象存在什么地方?我说内存中的堆,他又问“那我需要扫描整个堆吗?还是只需要扫描什么特定区域就行了?”我感觉他的意思是问我对象是存在堆中的什么区域,但是这个我真不知道,而且面完后搜了一下也没搜出个什么所以然来,所以就想求助广大牛友,这题该怎么回答?
#Java开发##腾讯#
全部评论
嗯…你不是第一个被腾讯问到这个问题的人,我感觉可能也不是最后一个😂😂
1 回复 分享
发布于 2022-02-13 11:42
新老永久代吧
点赞 回复 分享
发布于 2022-02-12 11:13
沿着GC ROOT引用链搜索,搜索不到的就是垃圾。从这点来看,应该会记录那些是GC ROOT(个人推测)
点赞 回复 分享
发布于 2022-02-12 12:55
是不是指oopmap
点赞 回复 分享
发布于 2022-02-15 22:22
个人看法的不一定对,Java堆内存分为新生代老年代,新生代又分为edn区s1和s2区,我们创建一个对象后会分配在edn区,每次垃圾回收后会将edn区存活对象移入s1,同时清空edn区。而s1和s2就是复制清除算法了,每次将存活的对象移到空的区域然后清空。对象每次转移年龄增大一岁,到了一定阈值(默认15)后移入老年代,而老年代使用cms垃圾收集器的话就使用的标记清楚算法,标记存活然后过一遍所有对象,没标记的回收。
点赞 回复 分享
发布于 2022-02-16 11:30
哪个部门呀
点赞 回复 分享
发布于 2022-02-16 13:36
回答三色标记算法?
点赞 回复 分享
发布于 2022-02-18 14:53
应该是想引安全点,oopmap,卡表之类的
点赞 回复 分享
发布于 2022-02-18 20:28
(回帖有字数限制,删除了很多内容)知识储备:(详解还是要看JVM篇章) 一、垃圾回收大致分为三大类别 |          | MinorGC            | MajorGC                      | FullGC                                                        二、可达性分析法的实现过程 1. 确定GCRoots。一般包含以下几个重要成分可能作为GCRoots    1. 虚拟机栈和本地方法栈中引用的对象    2. 堆中的字符串常量池和静态变量    3. 。。。 2. 从GCRoots开始遍历整个引用链,并将其标记为可存活。之后回收其他未被标记的即可 三、一个对象在堆的各个代中的流转过程(特殊情况除外:大对象等) 1. 对象创建之初一般在年轻代的Eden区 2. 当Eden满了之后触发MinorGC来将Eden和From区中可活对象放入To区。如果满了放入老年代。如果From中对象生存周期超过阀值则放入老年代 3. 然后调转From区和To区的定义 4. 如果遇到老年代空间满了就进行一次MajorGC。如果MajorGC之后还是不足就触发FullGC 问题一:根据不同的GC方式,扫描的区域也不同,也区别于不同的垃圾收集器。 + Parallel:严格的年轻代和老年代,在回收的时候扫描固定区域 + G1:针对分区算法,以及启动时配置的参数来跟踪并计算,在这个不超过最大时间间隔内回收哪些区的空间能做到最优。 问题二:一般对象创建之后就会出现在Eden区域,但是对于一些字符串常量、静态变量,则会出现在堆空间的字符串常量池中(字符串常量池是在JDK7之后才在堆中的)。对于一些Eden中存放不在的大对象可能会出现在老年代,此间可能会触发FullGC等情况 问题三:根据上述知识储备,不同的GC方式和不同的垃圾收集器,扫描的地方是不一样的,具体可以看知识储备。
点赞 回复 分享
发布于 2022-02-22 18:03

相关推荐

10-09 09:39
门头沟学院 C++
HHHHaos:这也太虚了,工资就一半是真的
点赞 评论 收藏
分享
重生2012之我是java程序员:换个稍微正式点的照片吧
点赞 评论 收藏
分享
点赞 32 评论
分享
牛客网
牛客企业服务