app server GC异常的问题分析

本文详细记录了分析系统APPServerGC异常的过程,包括Heap大小、年轻代设置、垃圾回收算法选择等。提出了通过调整JVM参数、增加日志输出等方法来优化性能,并提供了具体配置建议。

记录下前面分析系统APP Server GC异常的情况

根据服务器GC的参数设置,结合服务器Heap  一段时间居高不下(会阻塞一段时间,然后会回收),但是并未发生out of memory的情况,分析如下

 1、  Heap的总大小设置为1g,年轻代的大小128m,垃圾回收算法使用的是 gencon(并发垃圾收集,高响应性能),

这个算法更注重高响应,要求稍微大的年轻代大小。在此算法下,年轻代相对小的话,会导致过多的对象进入年老代。(建议适当增加年轻代大小)

<!--[if !supportLists]-->2、  <!--[endif]-->根据weblogic的官方文档,推荐使用以下配置

JRockit JDK

When using JRockit's JVM, experiment with the following garbage collection parameters:

<!--[if !supportLists]-->§ <!--[endif]-->-Xms and -Xmx (use equal settings at startup)

<!--[if !supportLists]-->§ <!--[endif]-->-Xns

<!--[if !supportLists]-->§ <!--[endif]-->-Xgc: parallel

<!--[if !supportLists]-->§ <!--[endif]-->-XXenablefatspin

 

3、建议增加以下参数,将GC收集的信息打印到一个文件中,方便查找  -Xverboselog:verbose-jrockit.log(通过这些GC的log,可以看出gc的具体信息,方便调整gc的配置)

 -Xverboselog:verbose-jrockit.log  会把GC收集的信息打印到verbose-jrockit.log  这个log文件里,bin目录下

 

 

 

<think>我们有一个命令片段:/bin/sh -c java -jar $JAVA_OPTS /app/app.jar --server.port=8080 另一个片段:-jar -Xms8000m -Xmx8000m -XX:+UseG1GC 注意:第二个片段看起来不是完整的命令,而是java命令的一些选项。其中包含了JVM内存设置和垃圾回收器设置。 我们需要将这两部分融合成一条命令。关键点在于: 1. 第一个命令中已经有一个`-jar`,而第二个片段中也出现了`-jar`,但按照java命令的语法,`-jar`后面应该紧跟着jar文件路径,因此第二个片段中的`-jar`可能是多余的,或者位置不对。 2. 第一个命令中使用了环境变量`$JAVA_OPTS`,通常这个变量用于设置JVM参数,比如堆内存大小等。 观察第二个片段,它包含的是JVM参数:`-Xms8000m -Xmx8000m -XX:+UseG1GC`。这些参数应该放在`java`命令和`-jar`之间,或者通过环境变量`JAVA_OPTS`传递。 因此,有两种融合方式: 方式一:将第二个片段中的参数直接插入到`java`命令和`-jar`之间。 原命令:/bin/sh -c java -jar $JAVA_OPTS /app/app.jar ... 修改后:/bin/sh -c java -Xms8000m -Xmx8000m -XX:+UseG1GC -jar $JAVA_OPTS /app/app.jar --server.port=8080 但是这里有一个问题:`$JAVA_OPTS`本身也是一个变量,它可能包含一些JVM参数。如果我们将这些参数直接放在一起,可能会导致冲突或重复。另外,注意`$JAVA_OPTS`的位置在`-jar`之前,所以它也是合法的。 然而,更常见的做法是将所有JVM参数放在一起,所以我们可以将新的参数和`$JAVA_OPTS`合并。 方式二:将新的参数合并到`JAVA_OPTS`环境变量中,然后执行原命令。 例如: export JAVA_OPTS="$JAVA_OPTS -Xms8000m -Xmx8000m -XX:+UseG1GC" /bin/sh -c java -jar $JAVA_OPTS /app/app.jar --server.port=8080 但是题目要求融合成一条命令,所以我们可以将设置环境变量和运行命令放在一条命令中,例如: /bin/sh -c "export JAVA_OPTS='$JAVA_OPTS -Xms8000m -Xmx8000m -XX:+UseG1GC'; java -jar $JAVA_OPTS /app/app.jar --server.port=8080" 但是注意:这样写可能会因为环境变量中的空格或其他特殊字符导致问题,而且嵌套引号也需要小心处理。 另外,观察原命令中已经有一个`$JAVA_OPTS`,所以我们也可以不修改环境变量,而是直接在命令中展开,将新的参数和原有的`JAVA_OPTS`拼接: /bin/sh -c java $JAVA_OPTS -Xms8000m -Xmx8000m -XX:+UseG1GC -jar /app/app.jar --server.port=8080 这种方式更直接,避免了修改环境变量,而且是一条命令。 但是这里需要注意的是:`JAVA_OPTS`中可能包含多个参数,而且这些参数中可能包含空格,所以直接展开可能会被正确解析。在shell中,变量展开后的空格会作为参数分隔符,所以通常是可行的。 因此,我推荐这种方式: /bin/sh -c java $JAVA_OPTS -Xms8000m -Xmx8000m -XX:+UseG1GC -jar /app/app.jar --server.port=8080 但是,请注意:如果`JAVA_OPTS`包含特殊字符(例如引号)或者包含路径中有空格,那么可能会出现问题。在这种情况下,需要确保`JAVA_OPTS`的值是正确引用的。不过,在大多数情况下,`JAVA_OPTS`中的参数都是用空格分隔的,所以这种方式是可行的。 另外,注意第二个片段中出现了两个`-jar`,我们只需要保留一个,而且应该在所有JVM参数之后,紧接着是jar文件路径。所以上面的命令中只有一个`-jar`,这是正确的。 如果用户希望避免因为`JAVA_OPTS`为空或者包含特殊字符导致的问题,可以使用以下方式: /bin/sh -c "java $JAVA_OPTS -Xms8000m -Xmx8000m -XX:+UseG1GC -jar /app/app.jar --server.port=8080" 注意:这里将整个java命令用双引号括起来,这样整个命令会作为`/bin/sh -c`后面的一个字符串参数,然后由shell解析。这样,如果`JAVA_OPTS`中包含空格,会被正确拆分为多个参数。 但是,如果`JAVA_OPTS`中包含引号或其他特殊字符,可能仍然会有问题。但在实际应用中,`JAVA_OPTS`通常只包含简单的参数,如`-D`设置系统属性,或者内存设置等,所以通常不会有问题。 总结:最终的融合命令可以是: /bin/sh -c "java $JAVA_OPTS -Xms8000m -Xmx8000m -XX:+UseG1GC -jar /app/app.jar --server.port=8080" 或者,如果不想使用双引号(因为可能嵌套引号带来复杂性),也可以不用双引号,前提是保证`JAVA_OPTS`中不包含空格(但实际上通常包含空格,所以最好用双引号): /bin/sh -c java\ $JAVA_OPTS\ -Xms8000m\ -Xmx8000m\ -XX:+UseG1GC\ -jar\ /app/app.jar\ --server.port=8080 但这样写可读性差,而且需要转义每个空格。所以还是推荐使用双引号的方式。 因此,最终命令: /bin/sh -c "java $JAVA_OPTS -Xms8000m -Xmx8000m -XX:+UseG1GC -jar /app/app.jar --server.port=8080" 注意:原命令中的`$JAVA_OPTS`可能是在当前shell环境中定义好的,我们直接将其展开。 另外,如果用户希望在新的shell中完全覆盖原来的`JAVA_OPTS`,那么也可以不考虑原来的`JAVA_OPTS`,直接使用新的参数: /bin/sh -c "java -Xms8000m -Xmx8000m -XX:+UseG1GC -jar /app/app.jar --server.port=8080" 但是根据问题描述,原命令中有`$JAVA_OPTS`,所以可能是需要保留原来的参数。因此,我们选择将新的参数追加到`$JAVA_OPTS`之后。 所以,我们给出如下答案: </think>要将命令 `/bin/sh -c java -jar $JAVA_OPTS /app/app.jar --server.port=8080` 与 JVM 参数 `-Xms8000m -Xmx8000m -XX:+UseG1GC` 融合为一条命令,需将 JVM 参数插入到 `java` 和 `-jar` 之间,并确保 `$JAVA_OPTS` 的正确展开。以下是具体解决方案: ### 最终融合命令: ```bash /bin/sh -c "java $JAVA_OPTS -Xms8000m -Xmx8000m -XX:+UseG1GC -jar /app/app.jar --server.port=8080" ``` ### 关键说明: 1. **参数位置逻辑** - JVM 参数(`-Xms`, `-Xmx`, `-XX:+UseG1GC`)必须放在 `java` 命令之后、`-jar` 之前 - `$JAVA_OPTS` 是环境变量,需直接展开到命令行中 - 使用双引号包裹整个命令:确保 `$JAVA_OPTS` 的值被正确解析(即使包含空格或特殊字符) 2. **注意事项** - 若 `$JAVA_OPTS` 已包含堆内存参数(如 `-Xms`),新参数会覆盖原值[^1][^2] - `-XX:+UseG1GC` 指定了 G1 垃圾收集器,适用于大堆内存场景[^3] - 堆内存设置为 `8000m`(约 8GB),需确保物理内存足够 ### 错误示例分析: ```bash # 错误:JVM参数不能放在-jar之后 /bin/sh -c java -jar $JAVA_OPTS -Xms8000m ... # ❌ 无效位置 # 错误:缺少双引号可能导致参数截断 /bin/sh -c java $JAVA_OPTS -Xms8000m ... # ❌ $JAVA_OPTS含空格时会出错 ``` ### 扩展建议: - **监控内存使用**:启动后通过 `jstat -gc <pid>` 验证堆内存和 GC 策略是否生效 - **容器化部署**:若在 Docker 中运行,需同步调整容器内存限制(如 `docker run --memory 10g`) ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值