当前位置: 首页 > 面试题库 >

有没有办法用Java计划完整垃圾回收?

谷森
2023-03-14
问题内容

我有一个按24x6时间表运行的应用程序。当前,运行几天后,会自动执行Full GC(通常在一天中的繁忙时间),这会对用户响应时间产生负面影响。

我想做的是强制使用Full
GC(也许是在每晚的午夜,在非常短的使用时间内),以防止它在白天发生。我已经尝试过System.gc(),但是它似乎无法保证何时会发生Full
GC,甚至不会发生。有这样做的方法吗?

版本信息:

Java™SE运行时环境(内部版本1.6.0_11-b03)
Java HotSpot™服务器VM(内部版本11.0-b16,混合模式)

另外-

  • 次要GC大约每10-15秒运行一次。但是这些都没有释放足够的内存来使应用程序运行一整周。当发生完全GC时,将释放近50%的堆。
  • 关于上述内容,调用System.gc()似乎并不意味着接下来的任何GC都将具有释放大量大块内存所需的Full形式。是的,它已启用(或不禁用,取决于您阅读-XX选项的方式)。
  • 我已经尝试了多个CMS GC设置,这些设置虽然有很大帮助,但并没有解决问题。最初,它是每周两次抛出OOM两次。
  • 我想停止无休止的循环:
    • 不断增加堆空间-只能持续这么长时间
    • 不断地调整和测试GC设置-远远超出了收益递减点
  • 我不想像一台NT机器那样对待它,并且每晚都将其弹回。整个晚上都有活跃的用户会话,而将应用程序弹开将意味着丢失会话数据。

更具体地说,我正在寻找一种可用于确保将发生Full GC的技术,而不是一种用于运行它的简单方法/函数。

目前,我正在查看CMS用于确定何时需要Full GC的百分比阈值的修改。

谢谢你的帮助。


问题答案:

jmap -histo:live <PID>将强制使用Full GC作为查找所有活动对象的“副作用”。您可以安排它在下班时间回收JVMhtml" target="_blank">进程。

您的JVM build 1.6.0_11-b03很古老,但是jmap所有1.6 HotSpot JVM都应支持。



 类似资料:
  • 问题内容: 我已经阅读了很多有关在Java中优化GC的文章,并且经常想知道有多少人 真正 使用了一些更高级的功能。 我一直避免在可能的地方进行调整,而专注于编写我能做的最简单的代码(Brian Goetz的建议)-到目前为止,这对我来说似乎一直很好。 这些调整策略是否具有弹性,可以跨VM版本进行更改,或者它们需要不断进行重新评估? 我使用的一种调优是-server标志。 问题答案: 我当前工作的一

  • 主要内容:1 什么是Java 垃圾回收,2 Java 垃圾回收的优势,3 如何取消对象引用,4 finalize()方法,5 gc()方法,6 Java 垃圾回收的例子1 什么是Java 垃圾回收 在Java中,垃圾意味着未引用的对象。 垃圾回收是自动回收运行时未使用的内存的过程。换句话说,这是销毁未使用对象的一种方法。 我们在C语言中使用free() 函数,在C ++中使用delete()。但是,在Java中它是自动执行的。因此,java提供了更好的内存管理。 2 Java 垃圾回收的优势 它

  • 问题内容: 我想知道Java中发生的垃圾回收。它真的能够处理所有未使用的对象并释放最大可能的内存吗? 我还想知道Java垃圾收集与另一种语言(例如C#)相比如何?然后,如何自动垃圾收集与从像C这样的语言中进行手动收集相比又能达到更好的效果呢? 问题答案: 是的,这就是垃圾收集的重点。 有许多不同形式的垃圾收集。如果不增强算法,最简单的形式即引用计数就无法处理某些类型的垃圾(循环引用)。 Java(

  • 问题内容: 我知道在PHP中您不必释放内存。垃圾收集器到达了吗? 问题答案: 是的,这里有一篇不错的文章描述了它的陷阱。在PHP> 5.3.0中,还有gc_enable函数。

  • 问题内容: 我想知道触发Java完整垃圾收集的确切情况是什么。 显而易见的是: 用完了老一代 用完了perm gen 调用System.gc() 那么其他导致全gc的情况又如何呢?尤其: Survivor Space中的可用空间不足,无法从Eden复制对象。 次要收藏集无法应付新对象的分配率(虽然不知道如何)。 我正在运行Sun Java 1.6,并将Concurrent Mark-Sweep和P

  • 1、对象是否已死算法 引用计数器算法 可达性分析算法 2、GC算法 (1)标记清除算法 如果对象被标记后进行清除,会带来一个新的问题--内存碎片化。如果下次有比较大的对象实例需要在堆上分配较大的内存空间时,可能会出现无法找到足够的连续内存而不得不再次触发垃圾回收。 (2)复制算法(Java堆中新生代的垃圾回收算法) 先标记待回收内存和不用回收内存; 将不用回收的内存复制到新的内存区域; 就的内存区