【问题标题】:Collecting old objects from java heap从 Java 堆中收集旧对象
【发布时间】:2016-03-08 20:07:56
【问题描述】:

我有 Order_Item 类实例,这些是 GC Roots 的路径(不包括 phantom/weak/soft 引用):

我有几个问题:
1) 我不确定 Order_Item 是否会被垃圾回收。
我尝试运行 System.gc(),但对象仍在堆中。
可以根据提供的图片收集吗?

2) “本机堆栈”是什么意思? 据我了解,它被视为GC root。 http://help.eclipse.org/mars/index.jsp?topic=%2Forg.eclipse.mat.ui.help%2Fconcepts%2Fgcroots.html 为什么某些对象(即订单 0x782032cf8)保留在“Native Stack”中?

3) 如果我有从 GC Root 到对象 A 的引用,那么该对象不会被垃圾回收吗?对吧?
如果是这样,我的 Order_Item 对象不能被垃圾回收吗?

4) 如果 3 是正确的,我如何找到保留对象 0x7821da5e0 和 0x782032cf8 的内容,以及如何取消引用/删除它们?

【问题讨论】:

    标签: java garbage-collection native-code eclipse-memory-analyzer


    【解决方案1】:

    您不能真正强制垃圾收集器删除给定对象。您知道,只要可以通过程序中给定点的引用访问该对象,该对象就会保持活动状态。但是如果对象变得“可收集”,它可能很快就会被收集,但如果没有内存压力,它可能会鬼混很长时间。

    通常,如果有足够的内存,就没有理由真正删除对象。我知道的唯一例外是密码。在这里,你使用了一个 char 数组,一旦你使用它就用废话覆盖它。

    对于本机堆栈:您的链接表明本机堆栈保留外部资源,例如文件。

    【讨论】:

    • 老实说,我不明白你的回答。我的同事也是。
    • 我会更彻底地解释它,但给我提示你不明白的地方。
    • 我的问题是结构化的,这样我不仅能理解当前的案例,也能理解未来的案例。以同样的方式获得答案会很棒。 1)你知道....程序。 - 所以答案是否定的? 2,3,4 - 未回答。
    • 对不起,我没有直接解决您问题的不同部分。我想告诉你的是,没有确定的方法可以从堆中删除对象。您可以允许垃圾收集器获取它(通过将所有对它的引用设置为 null 或让指向它的对象超出范围),但它可能不会这样做。
    • 通常,我使用调用层次结构搜索构造函数调用,并尝试最小化构造对象的生命周期。如果您的课程在非常多的地方使用,这可能会很耗时。很抱歉我无法帮助您解决您的问题。
    猜你喜欢
    • 2016-02-11
    • 2023-03-17
    • 2011-07-30
    • 2015-08-10
    • 2014-10-18
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    相关资源
    最近更新 更多