Java - Can调用系统.Gc两次,释放底层对象两次

Java - Can calling System.gc two times release underlying object twice?

本文关键字:两次 对象 Can 调用 系统 Java Gc 释放      更新时间:2023-10-16

我有一个Java程序,它调用我的c++库。jni - c++桥接使用SWIG创建
我对Java比较陌生& &;试图理解系统的行为。gc , System.runFinalization
下面的代码导致SIGABRT,杀死我的应用程序(10次运行2次)

public static void main (String[] args)
{
    try
    {
        doSomeStuff();
    } catch(Exception ex)
    {
        System.out.println(ex.getMessage());
    } finally {
        System.runFinalization();
        System.gc();
    }
}
void doSomeStuff()
{
    try
    {
        sampleCppClass cppClass = new sampleCppClass();
        /*
        *   do some stuff with Cpp obj
        */
    } catch (Exception ex)
    {
        System.out.println(ex.getMessage());
    } finally {
        System.runFinalization();
        System.gc();
    }
}


而这个效果很好

public static void main (String[] args)
{
    try
    {
        doSomeStuff();
    } catch(Exception ex)
    {
        System.out.println(ex.getMessage());
    } finally {
        System.runFinalization();
        System.gc();
    }
}
void doSomeStuff()
{
    try
    {
        sampleCppClass cppClass = new sampleCppClass();
        /*
        *   do some stuff with Cpp obj
        */
    } catch (Exception ex)
    {
        System.out.println(ex.getMessage());
    } 
}


我知道System.gc() &System.runFinalization()是不确定的(Source-1, Source-2和Source-3)。
doSomeStuff中的System.gc()会被执行吗&Free是对象。
之后,主运行中的System.gc() &试图释放相同的对象导致崩溃?如果确实如此,是否有办法证明它(日志/打印来显示gc释放对象的顺序)?
这篇文章解释了SIGABRT的原因
因为我在发布模式下运行,我的c++库没有任何assert/abort。因此,我关心的是所考虑的对象的双重/多重自由。

doSomeStuff()中的System.gc()会被执行吗&Free是对象

是的,但是它也可能什么都不做。

之后,System.gc()在主运行&试图释放相同的对象导致崩溃?

。这是垃圾收集,而不是c++的销毁。每个对象只发生一次,或者根本不发生。

就这段代码而言,问题的根本原因是您的gc()runFinalization()调用顺序错误。如果之前没有GC, runFinalization()什么都不做。它执行终结器队列,该队列只由GC填充。

所以当你做两次时,只有第二个runFinalization()做了任何事情。这可能会执行SampleCPPClass中的终结器,这似乎有一个错误,显然是在本机代码中。

但是由于您没有发布相关代码,因此无法进一步注释