是否有可能在Java中强制垃圾收集,即使这很棘手?我知道System.gc();和Runtime.gc ();但他们只建议做GC。如何强制GC?
当前回答
在OutOfMemoryError的文档中,它声明除非虚拟机在完整的垃圾回收后未能回收内存,否则它不会被抛出。因此,如果您一直分配内存直到出现错误,那么您将已经强制进行完整的垃圾收集。
想必您真正想问的问题是“如何回收我认为应该通过垃圾收集回收的内存?”
其他回答
如何强制Java GC
好了,这里有几种强制Java GC的不同方法。
单击JConsole的Perform GC按钮 使用JMap的JMap -histo:live 7544命令,其中7544是pid 调用Java诊断控制台的jcmd 7544 GC.run命令 调用system . gc ();在代码中 .gc调用Runtime.getRuntime () ();在代码中
这些都不行
这是一个肮脏的小秘密。这些方法都不能保证有效。你真的不能强制Java GC。
Java垃圾收集算法是不确定的,虽然所有这些方法都可以激励JVM执行GC,但实际上不能强制执行。如果JVM有太多事情要做,而停止世界操作是不可能的,那么这些命令要么会出错,要么会运行,但GC实际上不会发生。
if (input.equalsIgnoreCase("gc")) {
System.gc();
result = "Just some GC.";
}
if (input.equalsIgnoreCase("runtime")) {
Runtime.getRuntime().gc();
result = "Just some more GC.";
}
解决恼人的问题
如果遇到内存泄漏或对象分配问题,请修复它。坐在那里,手指放在Java任务控制的强制Java GC按钮上,只会拖延时间。使用Java Flight Recorder配置应用程序,在VisualVM或JMC中查看结果,并修复问题。试图强制Java GC是一个愚蠢的游戏。
FYI
方法调用System.runFinalizersOnExit(true)保证终结器方法 在Java关闭之前调用。然而,这种方法本质上是不安全的 并且已经被弃用。另一种方法是在方法中添加“关机钩子” Runtime.addShutdownHook。
马萨拉特·西迪基
在带有G1 GC的OracleJDK 10上,对System.gc()的单个调用将导致GC清理旧集合。我不确定GC是否立即运行。但是,即使在循环中多次调用System.gc(), GC也不会清理Young Collection。为了让GC清理Young Collection,你必须在一个循环中分配(例如new byte[1024]),而不调用System.gc()。出于某种原因调用System.gc()会阻止GC清理Young Collection。
您可以尝试使用Runtime.getRuntime(). GC()或使用实用方法System.gc()注意:这些方法不能确保GC。它们的作用范围应该限制在JVM中,而不是在应用程序中以编程方式处理它。
真的,我不懂你。而是成为 清楚“无限物体创造” 我是说有一些 代码在我的大系统做创建 可以处理的对象,并在其中生活 回忆,我无法得到这一片 其实是代码,只是个手势!!
这是正确的,唯一的姿态。你已经有了很多标准答案。让我们一个一个来看:
我无法得到这段代码 实际上
正确,没有真正的jvm——这只是一个规范,一堆描述期望行为的计算机科学…我最近研究了如何从本地代码初始化Java对象。要得到你想要的东西,唯一的方法就是执行所谓的主动置空。如果做错了,错误是非常糟糕的,我们必须将自己限制在问题的原始范围内:
我大系统里的一段代码 创建对象
这里的大多数海报会假设你说你正在处理一个界面,如果是这样的话,我们就必须看看你是一次被交付整个对象还是一个项目。
如果你不再需要一个对象,你可以将null赋值给该对象,但如果你弄错了,就会生成一个空指针异常。我敢打赌,如果您使用NIO,您可以实现更好的工作
任何时候你或我或其他人得到:“拜托,我非常需要那个。”这几乎是一个普遍的前兆,几乎完全破坏你正在努力工作....写一个小的示例代码,从它消毒任何实际使用的代码,并向我们展示您的问题。
不要沮丧。通常情况下,这意味着您的dba正在使用从某个地方购买的包,并且原始设计没有针对大规模数据结构进行调整。
这很常见。
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作
- 在Java流是peek真的只是调试?
- Recyclerview不调用onCreateViewHolder
- 将JSON字符串转换为HashMap