我们在Tomcat8.5.47服务器上运行了一个java8 web应用程序,每次只有20-60个用户会话,但大多数时候服务器上的上传文件高达600MB。我们还使用hibernate和c3p0管理数据库连接。我们监控服务器好几天了,有时看到java预留ram突然增加,垃圾收集器不释放它。我们该如何管理这个问题?有没有什么方法释放预留ram和防止tomcat增加ram?还有什么方法可以减少任务管理器中使用的内存?
以下是我们的设置:
-XX:MaxPermSize=1g -XX:+UseG1GC -XX:+UseStringDeduplication -XX:MaxHeapFreeRatio=15 -XX:MinHeapFreeRatio=5 -XX:-UseGCOverheadLimit -Xmn1g -XX:+UseCompressedOops -Xms10g -Xmx56g
附言。我们使用jprofiler进行配置文件,绿色显示保留的ram,蓝色显示使用的ram,在第二个框中可以跟踪gc活动,第三个框显示类,第四个框显示线程活动,最后一个框显示cpu活动。
谢谢大家的回答。
这些类型的问题从来都不容易,主要是因为要让它“正确”,提问者需要对操作系统如何对待和处理内存有一些基本的理解;并且存在不同类型的内存(至少有驻留
、提交
和保留
)。到目前为止,我还不够多才多艺,无法完全正确地完成这件事,但我会不断学习,并在这方面做得更好。它们意味着非常不同的事情,其中一些通常是不相关的(我发现保留
就是这样)。您正在使用windows,因此,imho是一开始必须注意的。
看完之后,您需要转到JVM世界以及JVM如何处理。堆由垃圾收集器管理,因此要收缩一些未使用的堆,GC需要能够做到这一点。虽然在jdk-12之前,G1可以做到这一点,但它从来没有非常渴望做到这一点。从jdk-12开始,有一个将返回内存的JEP,即:它将取消提交内存返回。不过,当这种情况发生时,一定要阅读。还要注意,其他收集器如Shenandoah
和/或ZGC
更经常这样做。
当然,由于禁用了-usegcoverheadlimit
,所以CPU会出现巨大的峰值(为了释放空间,GC线程会疯狂地运行),当然一切都会变慢。如果我是你,我会把它启用回来,让GC失败并分析GC日志以了解发生了什么。56GB
的堆对于20-60个用户来说是一个巨大的数字(这看起来肯定像是一个漏洞?)。请注意,如果没有GC日志,这可能不可能给出解决方案。
问题内容: 我对可以控制CMS收集器启动时间的两个参数感到困惑: (默认为70%) (默认情况下超过90%) 这些参数的确切含义是什么?收集器什么时候开始(标记阶段)并收集(清扫阶段)? 问题答案: 决定何时启动CMS(为了使此选项生效,您还必须设置)。是确定世代空间大小的选项。 参见例如… http://java.sun.com/docs/hotspot/gc1.4.2/faq.html 通常无
问题内容: 是什么决定了垃圾收集器何时真正收集?它是在一定时间之后还是在一定数量的内存用完之后发生的吗?还是还有其他因素? 问题答案: 它在确定是时候运行时运行。在世代垃圾收集器中,一种常见的策略是在第0代内存分配失败时运行收集器。也就是说,每次你分配一小块内存(大块通常直接放置在“旧”代中)时,系统都会检查gen-0堆中是否有足够的可用空间,如果没有,则运行GC释放空间以使分配成功。然后将旧数据
问题内容: 简短形式:CMS垃圾收集器似乎无法收集数量不断增加的垃圾;最终,我们的JVM填满,应用程序变得无响应。通过外部工具(JConsole或)强制GC 清理一次。 更新:该问题似乎与JConsole的JTop插件有关。如果我们不运行JConsole,或者在没有JTop插件的情况下运行它,则该行为消失。 (技术说明:我们正在Linux 2.6.9机器上运行32位Sun JDK 1.6.0_07
主要内容:JEP 189 : Shenandoah:一个低暂停时间的垃圾收集器(实验性),JEP 346 : 及时返回未使用的已提交内存,JEP 344:可中止的混合集合Java 12 为其垃圾收集算法引入了多项增强功能。 JEP 189 : Shenandoah:一个低暂停时间的垃圾收集器(实验性) 引入了一个实验性的低暂停时间垃圾收集器 Shenandoah 以减少 GC 暂停时间。它与运行 Java 线程并行工作。这有助于减少 GC 对堆大小的依赖性并使其保持一致。现在垃圾收集暂停时间对于
主要内容:JEP 304 : 垃圾收集器接口,JEP 307 : G1 的并行 Full GCJEP 304 : 垃圾收集器接口 在 Java 10 之前,GC(垃圾收集器)实现组件分散在代码库中,不容易替换。在 Java 10 中,引入了 Garbage-Collector 接口,以便可以插入替代的 GC 实现。它还有助于将代码库与不同的垃圾收集实现隔离。此功能是 JEP 304 的一部分。 JEP 307 : G1 的并行 Full GC Java 9 引入了 G1(垃圾优先)垃圾收集
问题内容: 我是Java新手,对Java中的垃圾收集器感到困惑。它实际上是做什么的,什么时候生效。请描述Java中垃圾收集器的一些属性。 问题答案: 该垃圾收集器是运行在一个程序的Java虚拟机,其摆脱其未使用的Java应用程序了对象。它是自动内存管理的一种形式。 当典型的Java应用程序运行时,它正在创建新的对象,例如和,但是在一段时间之后,这些对象将不再使用。例如,看下面的代码: 在上面的代码