Java - Can调用系统.Gc两次,释放底层对象两次
Java - Can calling System.gc two times release underlying object twice?
我有一个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
中的终结器,这似乎有一个错误,显然是在本机代码中。
但是由于您没有发布相关代码,因此无法进一步注释
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- C++析构函数调用两次,堆栈分配的复合对象
- C++两次从文件保存对象读取多重继承
- 在条件运算符中使用对象两次会产生 UB 吗?
- 为什么我的对象似乎被创建了两次
- 为什么静态thread_local对象在C++构造两次
- 如何在同一个线程上用同一个互斥对象锁定两次
- 为什么在 C++ 中,当对象包含在另一个对象中时,复制构造函数被调用两次
- 两次构造对象
- 删除对象两次
- C++-如果我使用映射,我的对象会被删除两次吗
- 在Qt 5.4中可以对互斥对象进行两次解锁吗
- 如何正确地将对象添加到向量,而无需两次调用析构函数
- 静态 c++ 对象中的 JNI 环境指针并调用连续两次使用字符串参数的 Java 函数会使 JVM 崩溃
- C++ 使用放置新的未定义行为构造对象两次
- 在为对象调用析构函数时,它被调用两次
- 使用默认构造函数返回临时对象时,Destuctor调用了两次
- c++如何初始化对象?下面的情况是这样做两次吗
- 对于在同一地址构造两次的对象,编译器如何知道必须调用第二个析构函数
- 为什么析构函数构造的两个对象被调用三次