Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于《深入理解java虚拟机》中对原始快照章节的疑问 #199

Open
ladyetcare opened this issue Jun 11, 2023 · 0 comments
Open

Comments

@ladyetcare
Copy link

周志明老师:
您好!我是您忠实的读者,最近在拜读《深入理解java虚拟机》的时候 有一个问题困扰我许久,特想向您请教。
在本书第三章中有一个小节是3.4.6并发的可达性分析中,您有写到“原始快照要破坏的是第二个条件(赋值器删除了全部从灰色对象到该白色对象的直接或间接引用),当灰色对象要删除指向白色对象的引用关系时,就将这个要删除的引用记录下来,在并发扫描结束之后,再将这些记录过的引用关系中的灰色对象为根,重新扫描一次,无论引用关系删除与否,都会按照刚刚开始扫描那一刻的对象图快照来进行搜索。”在这里我直接上图以便说明我的问题:如下图,正常是6引用9,在并发标记过程中,6对9的引用断开,改为5引用9,那么这个时候不管是增量更新或者原始快照都不会把9清理掉,因为当6对9的引用断开时在原始快照里9还是存活的对象,5新增对9的引用在增量更新算法里5会变成灰色对象重新扫描。但是:如果这里用户线程把5指向1,如果是增量更新,5会变成灰色对象,5和1都算存活的对象,但是如果是原始快照算法,那么按照原来的root链快照 还是不会把1判定为存活的对象,1还是会被当成垃圾,那这个时候原始快照不是有问题了吗?
所以我想知道在5指向1这种(没有灰色对象要删除指向白色对象的引用关系,原本就是不存活对象)情况下,原始快照怎么才能把1判定为存活对象,是不是还有什么前置条件。最后还有一个小问题,对于书籍中一些理论知识,如何在源码中验证,比如前面一点的oopMap,我就特别想在源码中找到对象的代码看一下,于是下载了openjdk的源码 但又苦于不知道从何看起,我是一名看完了整本书的读者,现在处于一个查漏补缺的阶段,希望老师能给与指点。
希望老师能帮忙解答,祝老师工作顺利,生活开心!
image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant