我在一些地方[1]看到人们在生产服务器(关键任务)中启动GC日志记录,例如java-server-Xms1024m-Xmx1024m-XX:NewSize=256m\-XX:MaxNewSize=256m\-XX:+UseConcMarkSweepGC\-XX:CMSInitiatingOccupancyFraction=70-XX:+PrintGCDetails\-XX:+PrintGCDateStamps\-XX:+PrintTenuringDistribution\-Xloggc:logs/gc.log\-Djava.awt.headless=true-Dcom.sun.mana
我在一些地方[1]看到人们在生产服务器(关键任务)中启动GC日志记录,例如java-server-Xms1024m-Xmx1024m-XX:NewSize=256m\-XX:MaxNewSize=256m\-XX:+UseConcMarkSweepGC\-XX:CMSInitiatingOccupancyFraction=70-XX:+PrintGCDetails\-XX:+PrintGCDateStamps\-XX:+PrintTenuringDistribution\-Xloggc:logs/gc.log\-Djava.awt.headless=true-Dcom.sun.mana
我仍在调查我在GC调优方面遇到的问题(请参阅priorquestion),这涉及大量阅读和实验。SunJava5+JVM尝试根据其环境自动选择最佳GC策略和参数,这很棒,但我不知道如何查询正在运行的JVM以找出这些参数是什么。理想情况下,我想看看虚拟机自动选择的各种与GC相关的-XX选项的值。如果我有这个,我可以有一个基线来开始调整。有人知道从正在运行的VM中恢复这些值吗? 最佳答案 -XX:+PrintCommandLineFlags打印通过命令行传递或由人体工程学(自动调整大小)功能配置的标志。-XX:+PrintFlagsIn
我仍在调查我在GC调优方面遇到的问题(请参阅priorquestion),这涉及大量阅读和实验。SunJava5+JVM尝试根据其环境自动选择最佳GC策略和参数,这很棒,但我不知道如何查询正在运行的JVM以找出这些参数是什么。理想情况下,我想看看虚拟机自动选择的各种与GC相关的-XX选项的值。如果我有这个,我可以有一个基线来开始调整。有人知道从正在运行的VM中恢复这些值吗? 最佳答案 -XX:+PrintCommandLineFlags打印通过命令行传递或由人体工程学(自动调整大小)功能配置的标志。-XX:+PrintFlagsIn
原始问题我正在运行一个Java程序,例如program.jar,带有一个“小”初始堆(1gb)和一个“大”初始堆(16gb)。当我以较小的初始堆运行它时,即java-jar-Xms1g-Xmx16gprogram.jar程序将在12秒后终止(多次运行平均)。相反,当我使用较大的初始堆运行它时,java-jar-Xms16g-Xmx16gprogram.jar程序将在30秒后终止(多次运行平均)。我从SO的其他问题中了解到,通常,大堆可能会导致过多的垃圾收集,从而降低程序速度:JavaverylargeheapsizesDoestheSunJVMslowdownwhenmorememor
原始问题我正在运行一个Java程序,例如program.jar,带有一个“小”初始堆(1gb)和一个“大”初始堆(16gb)。当我以较小的初始堆运行它时,即java-jar-Xms1g-Xmx16gprogram.jar程序将在12秒后终止(多次运行平均)。相反,当我使用较大的初始堆运行它时,java-jar-Xms16g-Xmx16gprogram.jar程序将在30秒后终止(多次运行平均)。我从SO的其他问题中了解到,通常,大堆可能会导致过多的垃圾收集,从而降低程序速度:JavaverylargeheapsizesDoestheSunJVMslowdownwhenmorememor
(请注意,当我说“JVM”时,我的意思是“热点”,我正在运行最新的Java1.6更新。)示例情况:我的JVM运行时-Xmx设置为1gb。目前,堆分配了500mb,其中450mb被使用。该程序需要在堆上再加载200mb。目前,堆中有300mb的“可收集”垃圾(我们假设它们都在最老的一代中。)在正常操作下,JVM会将堆增加到700mb左右,并在到达时进行垃圾收集。在这种情况下,我希望JVM先gc,然后分配新的东西,这样我们最终的堆大小保持在500mb,使用的堆大小保持在350mb。是否有一个JVM参数组合可以做到这一点? 最佳答案 您可
(请注意,当我说“JVM”时,我的意思是“热点”,我正在运行最新的Java1.6更新。)示例情况:我的JVM运行时-Xmx设置为1gb。目前,堆分配了500mb,其中450mb被使用。该程序需要在堆上再加载200mb。目前,堆中有300mb的“可收集”垃圾(我们假设它们都在最老的一代中。)在正常操作下,JVM会将堆增加到700mb左右,并在到达时进行垃圾收集。在这种情况下,我希望JVM先gc,然后分配新的东西,这样我们最终的堆大小保持在500mb,使用的堆大小保持在350mb。是否有一个JVM参数组合可以做到这一点? 最佳答案 您可
近期业务查询线上ES集群出现频繁超时告警,尤其是早晨某个时间点固定的报一波超时,从调用链监控上很难看出是什么业务行为导致的。初步猜测查看Grafana上Elasticsaerch的基础监控,发现业务告警与ES的OldGC(老年代GC)卡顿时间基本吻合: 同时注意到,Old区的内存持续增长,不到1小时就会将Old区填满,经过OldGC几乎全部可以回收掉:猜测:是什么导致Old区快速增长?可能是内存分配速率过高导致过早晋升?可能是分配很大的对象?为什么OldGC这么慢?ES卡顿大概率与它有关,早晨时间固定发生可能与业务某种行为有关。查看GC配置所以先用JVM工具从外围查看一下GC配置与大概情况。j
近期业务查询线上ES集群出现频繁超时告警,尤其是早晨某个时间点固定的报一波超时,从调用链监控上很难看出是什么业务行为导致的。初步猜测查看Grafana上Elasticsaerch的基础监控,发现业务告警与ES的OldGC(老年代GC)卡顿时间基本吻合: 同时注意到,Old区的内存持续增长,不到1小时就会将Old区填满,经过OldGC几乎全部可以回收掉:猜测:是什么导致Old区快速增长?可能是内存分配速率过高导致过早晋升?可能是分配很大的对象?为什么OldGC这么慢?ES卡顿大概率与它有关,早晨时间固定发生可能与业务某种行为有关。查看GC配置所以先用JVM工具从外围查看一下GC配置与大概情况。j