是否有可能在Java中强制垃圾收集,即使这很棘手?我知道System.gc();和Runtime.gc ();但他们只建议做GC。如何强制GC?
当前回答
在未来的版本中,.gc可能会被淘汰——一位Sun工程师曾经评论说,世界上可能只有不到20人真正知道如何使用.gc()——我昨晚花了几个小时研究一个中心/关键数据结构,使用securerrandom生成的数据,当超过40000个对象时,虚拟机就会变慢,就像指针用光了一样。显然,它被16位指针表所阻塞,并表现出典型的“机械故障”行为。
我尝试了-Xms等等,一直在旋转,直到它运行到大约57,xxx什么的。然后,在gc()之后,它将运行gc,从57,127到57,128——大约是Easy Money营地代码膨胀的速度。
你的设计需要基本的重新工作,可能是一个滑动窗口的方法。
其他回答
真的,我不懂你。而是成为 清楚“无限物体创造” 我是说有一些 代码在我的大系统做创建 可以处理的对象,并在其中生活 回忆,我无法得到这一片 其实是代码,只是个手势!!
这是正确的,唯一的姿态。你已经有了很多标准答案。让我们一个一个来看:
我无法得到这段代码 实际上
正确,没有真正的jvm——这只是一个规范,一堆描述期望行为的计算机科学…我最近研究了如何从本地代码初始化Java对象。要得到你想要的东西,唯一的方法就是执行所谓的主动置空。如果做错了,错误是非常糟糕的,我们必须将自己限制在问题的原始范围内:
我大系统里的一段代码 创建对象
这里的大多数海报会假设你说你正在处理一个界面,如果是这样的话,我们就必须看看你是一次被交付整个对象还是一个项目。
如果你不再需要一个对象,你可以将null赋值给该对象,但如果你弄错了,就会生成一个空指针异常。我敢打赌,如果您使用NIO,您可以实现更好的工作
任何时候你或我或其他人得到:“拜托,我非常需要那个。”这几乎是一个普遍的前兆,几乎完全破坏你正在努力工作....写一个小的示例代码,从它消毒任何实际使用的代码,并向我们展示您的问题。
不要沮丧。通常情况下,这意味着您的dba正在使用从某个地方购买的包,并且原始设计没有针对大规模数据结构进行调整。
这很常见。
JVM规范没有详细说明垃圾收集。因此,供应商可以自由地以自己的方式实现GC。
因此,这种模糊性导致了垃圾收集行为的不确定性。您应该检查JVM的详细信息以了解垃圾收集方法/算法。此外,还有自定义行为的选项。
jlibs库有一个很好的用于垃圾收集的实用程序类。您可以使用WeakReference对象的一个漂亮的小技巧强制垃圾收集。
RuntimeUtil.gc()从jlibs:
/**
* This method guarantees that garbage collection is
* done unlike <code>{@link System#gc()}</code>
*/
public static void gc() {
Object obj = new Object();
WeakReference ref = new WeakReference<Object>(obj);
obj = null;
while(ref.get() != null) {
System.gc();
}
}
强制GC的最佳(如果不是唯一)方法是编写自定义JVM。我认为垃圾收集器是可插拔的,因此您可能只需要选择一个可用的实现并对其进行调整。
注意:这不是一个简单的答案。
是的,几乎可以强迫你必须以相同的顺序调用方法,同时这些方法是:
System.gc ();
System.runFinalization ();
即使只是一个对象来清理,同时使用这两个方法强制垃圾收集器使用不可达对象的finalize()方法释放分配的内存并执行finalize()方法的状态。
不过是一个可怕的实践使用垃圾收集器,因为使用它可能会引入一个加载的软件可能甚至比在内存坏,垃圾收集器有自己的线程是不可能控制+根据gc可能需要更多的时间和所使用的算法是考虑非常低效,您应该检查您的软件如果它坏在gc的帮助,因为它绝对是坏,一个好的解决方案不能依赖于gc。
注意:只是要记住,只有在finalize方法中没有对对象进行重赋时,这才会起作用,如果发生这种情况,对象将保持存活,它将有一个复活,这在技术上是可能的。
推荐文章
- 如何格式化Joda-Time DateTime仅为mm/dd/yyyy?
- 如何在POM.xml中引用环境变量?
- 如何在android中复制一个文件?
- 将整数转换为字符串,以逗号表示千
- 接口方法的最终参数-有什么意义?
- Java中的@UniqueConstraint注释
- 如何在清洁模式下运行eclipse ?如果我们这样做会发生什么?
- 获取java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory异常
- Java中的正则表达式命名组
- c#和Java的主要区别是什么?
- 什么是NullPointerException,我如何修复它?
- 在Java中使用“final”修饰符
- 无法在Flutter上找到捆绑的Java版本
- 如何在Kotlin解析JSON ?
- 如何在新的材质主题中改变背面箭头的颜色?