我们有一个 AWS EC2 实例(t3.xlarge,有 16GB 内存)64 位(x86_64 GNU/Linux)。它正在记录以下错误:
ERROR 10:47:09.326 std.err - Memory: 8555069440 of: 34324873216
ERROR 10:47:09.326 std.err - Thread count: 976
ERROR 10:47:09.326 std.err - IO TPI: 6776.744165170557 TPO: 7549.293 IOR: 1.1139999999999999 QSZ: 37 THROTTLE: 0
所以我想我需要调整JVM内存以允许它使用可用的16B内存(似乎限制为8GB)。
下面显示了 JVM 中的旧代内存当前为 8GB(即
concurrent mark-sweep generation total 8047872K
),其中 941
是在端口 8080 上运行的应用程序的 PID。
jcmd 941 GC.heap_info
941:
par new generation total 306688K, used 215304K [0x00007fb2c8000000, 0x00007fb2dccc0000, 0x00007fb2dccc0000)
eden space 272640K, 76% used [0x00007fb2c8000000, 0x00007fb2d4bf7738, 0x00007fb2d8a40000)
from space 34048K, 18% used [0x00007fb2d8a40000, 0x00007fb2d908aa60, 0x00007fb2dab80000)
to space 34048K, 0% used [0x00007fb2dab80000, 0x00007fb2dab80000, 0x00007fb2dccc0000)
concurrent mark-sweep generation total 8047872K, used 2223911K [0x00007fb2dccc0000, 0x00007fb4c8000000, 0x00007fbac8000000)
Metaspace used 223752K, capacity 235070K, committed 235164K, reserved 235520K
问题
我应该使用
JAVA_OPTS
来设置旧代内存吗?
例如
export JAVA_OPTS="-Xms6144m -Xmx6144m -XX:NewSize=256m -XX:MaxNewSize=356m -XX:PermSize=256m -XX:MaxPermSize=356m"
我应该设置什么值?
是的,您可以使用JAVA_OPTS环境变量来设置JVM内存参数。根据您提供的信息,您可以调整JAVA_OPTS,为老年代空间分配更多内存。修改方法如下:
导出JAVA_OPTS =“-Xms8g -Xmx16g -XX:NewSize = 256m -XX:MaxNewSize = 356m -XX:PermSize = 256m -XX:MaxPermSize = 356m”
参数说明:
-Xms8g:将初始堆大小设置为 8 GB。 -Xmx16g:将最大堆大小设置为 16 GB。 -XX:NewSize=256m:设置年轻代(eden+两个survivor空间)的初始大小为256MB。 -XX:MaxNewSize=356m:设置年轻代的最大大小为356 MB。 -XX:PermSize=256m:将永久代(Java 8及更高版本中的元空间)的初始大小设置为256 MB。 -XX:MaxPermSize=356m:将永久代的最大大小设置为356 MB。 这些值可能需要根据应用程序的内存要求和使用模式进行调整。此外,请确保您的应用程序与这些设置兼容并监控其性能以确保其行为符合预期。