我有一个开槽的java系统,每2秒运行一次代码,每次运行时间不到100毫秒。我想避免在100ms运行期间运行垃圾收集,但是在系统空闲的剩余1.9s中运行它。 目前垃圾收集可能会在100毫秒内运行,并且会增加约100毫秒,这在我的情况下是不可接受的。
程序的内存使用量约为2G,在100ms内可能会创建许多小对象。我也在多核系统(4核以上)上运行它。
答案 0 :(得分:1)
尝试-XX:+ UseParallelGC和-XX:+ UseOldParallelGC以最小化GC暂停。它专为多GB堆而设计,并在不同的线程上并行运行垃圾收集。它的目标是避免“停止世界”的收藏并尽量减少GS暂停。
答案 1 :(得分:1)
这看起来像calling System.gc() is useful时的少数情况。不能保证它会有所帮助,但它肯定值得一试。
您还可以尝试我最近提出的hack。它有点复杂,可能适得其反。
sum += new byte[123456].hashCode()
应该这样做)ReferenceQueue<PhantomReference>
),但不能保证它会在GC后很快运行runtime.getFreeMemory
,但是谁知道它是否可靠运行?-XX:+UnlockDiagnosticVMOptions -XX:+PrintGC
从外面观看正如我所说,对于没有理智的解决方案的情况来说,这只是一个黑客攻击。