Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于GC的Glassfish JVM设置_Java_Glassfish_Jvm - Fatal编程技术网

Java 用于GC的Glassfish JVM设置

Java 用于GC的Glassfish JVM设置,java,glassfish,jvm,Java,Glassfish,Jvm,我正在glassfish服务器上运行一个应用程序,我有以下JVM设置(我认为与我的问题相关):-Xmx512m-XX:NewRatio=2-XX:+UseParallelOldGC-XX:+UseParallelGC所有其他设置都是默认设置。在过去的48小时里,我一直在用JMC(Java任务控制)测试服务器性能,我注意到:PS Old Gen大约有341 MB的堆,PS Eden大约有143MB的堆,PS Surviovor大约有13MB的堆(这足够了还是我应该使用不同的SurviorRatio

我正在glassfish服务器上运行一个应用程序,我有以下JVM设置(我认为与我的问题相关):
-Xmx512m-XX:NewRatio=2-XX:+UseParallelOldGC-XX:+UseParallelGC
所有其他设置都是默认设置。在过去的48小时里,我一直在用JMC(Java任务控制)测试服务器性能,我注意到:PS Old Gen大约有341 MB的堆,PS Eden大约有143MB的堆,PS Surviovor大约有13MB的堆(这足够了还是我应该使用不同的SurviorRatio?)

图表显示,java堆在开始时有大约200MB的分配空间,但在每次完整GC之后,它会增长,所以现在大约是450MB,甚至使用的堆(在每次完整GC之后)也会下降到100MB左右,然后缓慢增长,直到下一次小GC/完整GC。。。为什么提交的java堆(红线)在增加?这是正常的行为吗?当它达到512MB时会停止吗?我是否应该使用-Xms512m,承诺的java堆从一开始就是512MB

现在谈谈垃圾收集: 小型GC(PS清除)大约每1分钟运行一次,持续时间约为10-30毫秒。完整GC(PS MarkSweep)大约每14-18小时运行一次,第一次持续时间为200ms,但最后一次持续时间为20秒(我不知道为什么持续时间有如此大的差异)!我想知道这是否可以,以及如何获得更好的结果?我应该使用
-XX:+useConMarkSweepGC-XX:+UseParNewGC
还是甚至应该使用
-XX:+UseG1GC
?如果我使用这些GC中的任何一个,我将不得不增加最大堆大小(我读到UseG1GC仅用于更大的堆)?除了GC类型(如SurvivorRatio、NewRatio等)之外,我是否还需要将任何其他设置更改为

JMC中的GC持续时间是否等于停止世界暂停时间(或暂停时间更短)?所以,如果我有20秒的完整GC持续时间,这是否意味着我的服务器在20秒内没有响应?我的服务器上有JAX-RS,我使用ajax每10秒调用一个JAX-RS(超时为10秒),这意味着至少两个调用不会成功?在这种情况下,ajax调用的状态是什么(可能是错误)?我必须警告用户错误调用,如果错误是GC暂停的结果,我不知道在这种情况下该怎么办

如果我有-Xmx1024m(比现在大两倍),完整GC会更少见,但它会持续更长的时间吗

我读了很多关于JVM和JVMGC的文章,但我仍然不知道我必须做什么才能使所有的设置都适合我的应用程序(我担心最后20秒的GC持续时间)

谢谢你的回答

完整GC(PS MarkSweep)大约每14-18小时运行一次,第一次持续时间为200ms,但最后一次持续时间为20秒

尝试通过
-XX:MaxGCPauseMillis
设置暂停时间目标

我应该使用-XX:+useConMarkSweepGC-XX:+UseParNewGC或者甚至-XX:+UseG1GC吗

这些当然是一种选择,但由于并行收集器最初似乎能够提供适当的延迟,而且随着旧版本的增加,延迟只会变得更糟,因此您可能不需要这样做

图表显示,java堆在开始时有大约200MB的分配空间,但在每次完整GC之后,它会增长,所以现在大约是450MB,甚至使用的堆(在每次完整GC之后)也会下降到100MB左右,然后缓慢增长,直到下一次小GC/完整GC。。。为什么提交的java堆(红线)在增加

因为您使用的是并行收集器,它的主要目标是吞吐量(如果没有指定限制,可能会损害内存占用或延迟)。它可以通过在大量垃圾堆积时很少收集来提供最高吞吐量

通过为其提供暂停时间目标,如果堆变得太大而无法满足暂停时间目标,它将停止增长堆

如果我有-Xmx1024m(比现在大两倍),完整GC会更少见,但它会持续更长的时间吗


可能,但是一旦堆不能满足
MaxHeapFreeRatio
目标,GC就会停止堆的增长。

那么,如果我将-XX:MaxGCPauseMillis设置为5000,GC间隔是否会缩短,以便GC可以在5秒内完成?如果GC不能在5秒内完成怎么办?为了优化GC持续时间,您是否建议我将Xms设置为512m(与Xmx相同)?MaxHeapFreeRatio的默认值(70%)可以吗?你能解释一下-XX:GCPauseIntervalMillis=X和-XX:MaxGCPauseMillis=X的用法吗?如果我将这些值设置为500ms和50ms,这是否意味着GC持续时间最长为50ms?第一个选项(GCPauseIntervalMillis)的作用是什么?我需要同时设置这两个还是只设置maxgc?如果我设置这两个参数,可能会有什么威胁?最后一个问题:如果我设置-XX:+useConMarkSweepGC-XX:+UseParNewGC,我能得到最差的GC结果吗?或者没有缺点?提前谢谢!你为什么不试试呢,也许结合负载测试?您可能还想阅读Ok,我在过去7天内使用XX:+useConMarkSweepGC和-XX:+UseParNewGC(不带-XX:MaxGCPauseMillis)运行了一些测试。最后一个CMS最终评语阶段耗时80秒,而之前的所有阶段(最终评语和初始评语)最长持续时间为2秒(大约有10个CMS)。这种行为的原因可能是什么?我没有设置-XX:maxgc,因为我在某个地方读到它可能会导致低吞吐量。我还读到我可以使用-XX:+UseLargePagesInMetaspace选项,但它可能会导致内存使用率下降,所以我不知道是否应该使用它。“因为我在某个地方读到它可能会导致低吞吐量”。它用一些吞吐量来换取暂停时间。你必须选择你的折衷方案,你不可能同时拥有一切。如果你关心暂停时间(你的问题表明你是),那么你应该设定一个目标。我想我已经回答了你最初的问题,如果你选择忽略它,我真的帮不了你。如果您对CMS有深入的问题,您可能应该提出一个新问题