gpt4 book ai didi

带有 Jetty 的 Java 8 on linux 内存问题

转载 作者:IT王子 更新时间:2023-10-29 00:39:27 26 4
gpt4 key购买 nike

能否请您帮我解决以下问题:

上下文:

我们正在尝试将目前在 Java6(Glassfish 上)生产环境中运行的现有应用程序迁移到 Java8(在 Jetty9 上)设置。早些时候,我们能够在 Java7(jetty9)上成功迁移相同的设置。但是客户现在决定使用 Java 8。在此过程中,我们遇到了一些内存问题,以下是详细信息:

问题描述:

启动 Jetty 服务器后,java 进程的初始 (RES) 内存使用量约为 5.5g。运行应用程序一段时间后,内存使用量缓慢上升并消耗机器上的最大可用物理内存 (8g),最终导致服务器/系统崩溃。

此问题仅在 linux 环境中遇到。 Windows环境下未发现此类问题。

探查器发现:

使用 VisualVMjconsole 监控服务器。在两个分析器中,JVM 的内存(堆和非堆)使用都在分配的限制之下。

环境细节:

Java Version :    8
Server : Jetty 9.2.10
OS : linux on a virtual machine(Linux version 2.6.32-279.14.1.el6.x86_64 (mockbuild@c6b8.bsys.dev.centos.org) (gcc version 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC) ) #1 SMP Tue Nov 6 23:43:09 UTC 2012
Java Options :
-Xms3072M

-server

-XX:+UnlockDiagnosticVMOptions

-XX:+LogVMOutput

-XX:+UseG1GC

-XX:MaxGCPauseMillis=75

-Xmx3072M

-Xss1024K

-XX:InitialCodeCacheSize=192M

-XX:CodeCacheExpansionSize=3M

-XX:CodeCacheMinimumFreeSpace=3M

-XX:ReservedCodeCacheSize=600M

-XX:MinMetaspaceExpansion=3M

-XX:MaxMetaspaceExpansion=18M

-XX:MaxMetaspaceSize=500M

-XX:MaxDirectMemorySize=288M

-XX:CompressedClassSpaceSize=512M

-XX:ParallelGCThreads=12

-XX:ConcGCThreads=4

-Dsun.rmi.dgc.server.gcInterval=86400000

-Dsun.rmi.dgc.client.gcInterval=86400000

PS:请不要将其标记为重复。我在 stackoverflow 上阅读了很多答案,但没有解决或解决我的问题。

更新

我使用以下 Java 选项启动 jetty,此后内存使用量在 4.5g-4.8g 之间(大约 142 小时)。它对我来说看起来很稳定。我通过 java 选项标志(Xmx 和 MetaspaceSize)保留了大约 2g 的内存,但总是使用额外的 2.5g。这是 Java 8 在 Linux 机器上的正常行为吗?

使用的 Java 选项:

-server
-XX:+UnlockDiagnosticVMOptions
-XX:+LogVMOutput
-XX:LogFile=../logs/jvm.log

-XX:+UseG1GC
-XX:MaxGCPauseMillis=75
-XX:ParallelGCThreads=12
-XX:ConcGCThreads=12
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:../logs/gc.log
-XX:NativeMemoryTracking=summary

-Xmx1500m
-Xss256k

-XX:MaxMetaspaceSize=512m

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/opt/logs/jetty.hprof

-Dsun.rmi.dgc.server.gcInterval=86400000
-Dsun.rmi.dgc.client.gcInterval=86400000

感谢您的宝贵时间!

最佳答案

这似乎是 Java8/9 中的一个问题,由于注释模块扫描 jars 并存在内存泄漏,因此在 Jetty 中表现出来。引用https://github.com/eclipse/jetty.project/issues/575 .我的一个解决方案(因为我不使用 Jetty 注释)是通过注释掉 jetty/modules/annotations.mod 中的行来禁用注释模块。所以 tie 文件看起来像这样:

#
# Jetty Annotation Scanning Module
#

[depend]
# Annotations needs plus, and jndi features
plus

[lib]
# Annotations needs jetty annotation jars
lib/jetty-annotations-${jetty.version}.jar
# Need annotation processing jars too
#lib/annotations/*.jar

[xml]
# Enable annotation scanning webapp configurations
#etc/jetty-annotations.xml

编辑 1 - 替代解决方案

关闭所有注释扫描可能过于激烈,它也会转向 jsp,因为它是依赖的。另一种方法是提供一个 Web 应用程序上下文,它使用一种模式来限制扫描。将其保存在 xml 中并与 war 一起部署在 webapps 中或将其包含在 war 中。

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/[myApp]</Set>
<Set name="war">/[DIRECTORY]/[myApp[.war</Set>
<Call name="setAttribute">
<Arg>org.eclipse.jetty.server.webapp.WebInfIncludeJarPattern</Arg>
<Arg>SCAN-NO-JARS</Arg>
</Call>
</Configure>

关于带有 Jetty 的 Java 8 on linux 内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33104516/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com