我的生产环境webapp中存在内存问题。
我有一个运行在AWS EC2 t2.medium实例中的Tomcat(2核cpu 64位+ 4gb ram)。
这是来自javamelody的一些信息:
OS: OS Linux, 3.13.0-87-generic , amd64/64 (2 cores)
Java: Java(TM) SE Runtime Environment, 1.8.0_91-b14
JVM: Java HotSpot(TM) 64-Bit Server VM, 25.91-b14, mixed mode
Tomcat "http-nio-8080": Busy threads = 4 / 200 ++++++++++++
Bytes received = 8.051
Bytes sent = 206.411.053
Request count = 3.204
Error count = 70
Sum of processing times (ms) = 540.398
Max processing time (ms) = 12.319
Memory: Non heap memory = 130 Mb (Perm Gen, Code Cache),
Buffered memory = 0 Mb,
Loaded classes = 12,258,
Garbage collection time = 1,394 ms,
Process cpu time = 108,100 ms,
Committed virtual memory = 5,743 Mb,
Free physical memory = 142 Mb,
Total physical memory = 3,952 Mb,
Free swap space = 0 Mb,
Total swap space = 0 Mb
Free disk space: 27.457 Mb
我的申请进入:
Java Runtime Environment没有足够的内存来继续。 本机内存分配(mmap)无法映射12288字节以提交保留内存。
我已经应用了以下配置选项,但它似乎再次失败。
导出JAVA_OPTS =" -Dfile.encoding = UTF-8 -Xms1024m -Xmx3072m -XX:PermSize = 128m -XX:MaxPermSize = 256m"
这个配置对我的linux配置是否正常?
有关详细信息:我的数据库和文件系统正在另一个t2.medium实例中运行(Windows 2核心cpu + 4gb ram)。
谢谢,对不起我的英语。
编辑:
问题仍在继续。最奇怪的是,在日志中没有大进程运行,并且它通过的时间是在早上(很少有人连接到应用程序)。
在过去,我在Windows环境中使用了应用程序,而且这种情况并没有发生。我认为Linux实例会更好,但我疯了。
日志:
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000f2d80000, 43515904, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 43515904 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /home/ubuntu/hs_err_pid20233.log
现在我的配置是 setenv.sh :
导出CATALINA_OPTS =" -Dfile.encoding = Cp1252 -Xms2048m -Xmx2048m -server"
我不知道是否有意义,但hs_err文件有这一行:
内存:4k页,物理4046856k(102712k免费),交换0k(0k免费)
答案 0 :(得分:0)
这个配置对你的linux配置是否正常?好吧,我们不知道机器上还有什么运行,以及其他进程将使用多少内存。因此,答案是“它取决于”。但是,您可以自行确定正确的设置:
如果您想知道服务器有足够的内存,请将-Xmx
和-Xms
设置为相同的值。这样,您在启动服务器时就会遇到OutOfMemory条件,而不是在将来的某些randome时间。也许你的操作系统可以只分配2.8G而不是3.(与你在Java7上运行时的permsize参数相同,否则删除它们)
您可能还想将-XX:+AlwaysPreTouch
添加到参数列表中,以便确保从一开始就已经分配了内存。
最后,您不希望设置JAVA_OPTS
(这将用于JVM的任何启动,包括shutdown命令),而是使用CATALINA_OPTS
(仅用于mkpasswd
启动tomcat)