Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使Java在System.exit(0)时释放所有内存?_Java_Winapi_Memory Leaks - Fatal编程技术网

如何使Java在System.exit(0)时释放所有内存?

如何使Java在System.exit(0)时释放所有内存?,java,winapi,memory-leaks,Java,Winapi,Memory Leaks,我们的应用程序是Java和本机代码的混合。它会泄漏内存 最有可能的原因是本机代码,实际上它也有泄漏的部分,但是,它们似乎不是唯一的原因 无论如何,我用本地的OpenJDK 6构建了一个本机分析器来评测应用程序,因此我有完整的源代码和Java本身的完整符号 方法很简单——我运行应用程序,然后在某个时候发出信号让它优雅地终止。优雅终止包括三个步骤: 向本机代码发送清除信号。 停止http服务器Restlet+Simple 呼叫系统exit0 显然,Java在很大程度上依赖操作系统来释放它所占用的内存

我们的应用程序是Java和本机代码的混合。它会泄漏内存

最有可能的原因是本机代码,实际上它也有泄漏的部分,但是,它们似乎不是唯一的原因

无论如何,我用本地的OpenJDK 6构建了一个本机分析器来评测应用程序,因此我有完整的源代码和Java本身的完整符号

方法很简单——我运行应用程序,然后在某个时候发出信号让它优雅地终止。优雅终止包括三个步骤:

向本机代码发送清除信号。 停止http服务器Restlet+Simple 呼叫系统exit0 显然,Java在很大程度上依赖操作系统来释放它所占用的内存,因为我可以看到几个调用VirtualAlloc来保留一些内存,但它从来都不是无保留的

但这只是一个例子,有大量未发布的已提交内存,无法确定哪些内存是特意留给操作系统发布的,哪些是泄漏。现在,我不怪Java,这些泄漏可能是我们做错了什么的结果。我不知道

一个重要的音符。我不是说在整个过程中进行清理。在处理这件事上有很多问题,但没有一个与我的有关。我希望Java在退出时进行清理,看看到底有多少内存泄漏


那么,有没有一种方法可以告诉Java在退出时进行清理,以使这种事后泄漏分析变得可行?

一个好的Java探查器,例如YourKit或JProfiler,会直接告诉您是否通过持有引用泄漏Java对象。这将回答您关于非JNI泄漏的问题


对于JNI泄漏,我是根据经验编写的,您需要确保您的本机代码可以在java之外进行测试,这样在java中特定链接的可能性很小,您可以通过仔细阅读来处理它。或者与橡皮鸭交谈。

你如何区分行为良好的内存和泄漏的内存?最好得到一个好的分析器,不要自己写任何东西。我会尝试确定哪些部分是由Java创建的,但可以忽略。Java从一开始就倾向于分配大的块,这应该让您了解哪些ONCE是Java,哪些ONCE是由您的程序创建的。您还可以在没有Java的情况下单独测试JNI代码吗?您说您使用的本机代码有泄漏,为什么不先修复这些?此外,释放本机支持类的资源是finalize真正有帮助的少数情况之一,前提是您有一个对释放资源的本机方法的引用,但即使这样做,也要记住调用super.finalize。我不是操作系统高手,所以我想知道,但是System.exit是否会终止进程,从而操作系统将释放该进程保留的所有内存?如果是这样的话,我就不明白这个问题了。@mark我怀疑你的工具所期望的是“良好实践”。我上次担心在退出进程之前释放所有内存是在1993年,那是因为一个写得很差的操作系统。我想说的是,您的工具的期望是非常不现实的,并且给您带来了巨大的痛苦和成本,完全没有任何意义,我建议您立即放弃它。在任何情况下,您都无法让Java按预期的方式运行。假设您正确地描述了该工具。