如何提高java中GC调用的速率?

如何提高java中GC调用的速率?,java,garbage-collection,jvm,Java,Garbage Collection,Jvm,如何提高java中GC调用的速率?是否有任何JVM参数来调整调用GC的速率 谢谢 如果更改GC暂停时间,则应更频繁地进行垃圾收集。这对于某些时间紧迫的应用程序可能很有用,因为在这些应用程序中,即使可能会有更多的垃圾收集,垃圾收集也不会花费那么长的时间-XpauseTarget应作为VM参数执行此操作。这里的最小值是10毫秒。不要调用System.gc()。取决于您将其称为什么,您可能会使您的应用程序效率极低 最好的办法是简单地优化应用程序,以使用更少的对象。您可以使用JDK附带的JVisualV

如何提高java中GC调用的速率?是否有任何JVM参数来调整调用GC的速率


谢谢

如果更改GC暂停时间,则应更频繁地进行垃圾收集。这对于某些时间紧迫的应用程序可能很有用,因为在这些应用程序中,即使可能会有更多的垃圾收集,垃圾收集也不会花费那么长的时间<代码>-XpauseTarget应作为VM参数执行此操作。这里的最小值是10毫秒。不要调用
System.gc()
。取决于您将其称为什么,您可能会使您的应用程序效率极低

最好的办法是简单地优化应用程序,以使用更少的对象。您可以使用JDK附带的JVisualVM等工具在运行时检查应用程序,找出问题所在,并查看垃圾收集信息

您还可以尝试其他垃圾收集器。我使用以下方法,在一些应用程序中,比如说,内存使用比CPU时间更重要(尽管这里有一些无用的选项——只需将它们剔除即可):


你为什么要提高GCs的比率?你到底想优化什么?是的,有。不要调用System.gc()。请查看右侧相关列中的类似帖子。。。具体来说:如果GC占用大量CPU使用,那么增加GC调用的速率并不能解决您的问题;这只会让事情变得更糟。如果您的JVM经过了很好的调优,那么它应该偶尔调用GC来清理年轻的一代,在较少的情况下清理旧的一代。+1将要编写类似的东西,但这里主要介绍它。需要补充的是,垃圾优先(g1)垃圾收集器与当前默认垃圾收集器有很大不同。切换到它意味着放弃许多当前持有的假设,这将是Java 7中的默认设置(除非他们再次改变主意)。您可能会发现这篇关于收集器的文章也很有趣::)非常感谢您的回复。我的应用程序使用本机opengl调用。当我在JVisualVM中跟踪内存使用情况时,它没有显示任何不一致性。然而,当在Windows任务管理器中跟踪进程内存时,它显示出稳定的增长。如果显式调用System.gc(),那么进程内存也会显示锯齿模式。我想避免System.gc()调用,所以尝试了MaxGCPauseMillis VM参数,效果很好。但是我不确定这是否是解决问题的正确方法。@cooltechnomax,如果它使用jni与OpenGL绑定(我无法想象它不会),那么您的程序可能会在非托管内存方面泄漏内存。Java的垃圾收集器只负责JVM创建的内存,而不负责jni层中分配的内存。如果您在C/C++调用中泄漏,那么它将解释为什么进程在内存中增长,但是JVM不知道它(因为它不直接涉及内存分配)。@ Edwin Buck:我尝试调试本地调用,但是找不到任何漏洞。如果jni层中存在漏洞,我无法理解System.gc()为什么要检查内存。不管System.gc()调用如何,内存不应该继续增加吗?
-Xincgc
-XX:+CMSIncrementalPacing
-XX:+UseAdaptiveSizePolicy
-XX:+AggressiveOpts
-XX:+ExplicitGCInvokesConcurrent
-XX:+UnlockExperimentalVMOptions
-XX:+UseConcMarkSweepGC
-XX:UseSSE=3
-XX:+UseParNewGC
-XX:SurvivorRatio=2
-XX:NewRatio=8
-XX:+DoEscapeAnalysis
-XX:+UseFastAccessorMethods
-XX:+ForceTimeHighResolution
-XX:+UseTLAB
-XX:+ResizeTLAB
-XX:MaxGCPauseMillis=10
-XX:ParallelGCThreads=8
-XX:+CMSParallelRemarkEnabled
-XX:+DisableExplicitGC
-XX:+UseAdaptiveGCBoundary
-XX:-UseGCOverheadLimit
-Xnoclassgc
-server
-Xss128k
-Xms1g
-Xmx1g