机器内存是 8G
在已经打开多个IDEA的情况下,启动Tomcat8.0出现问题
看到这个第一感觉就是内存不足了。但是看了任务管理器实际上用了80%左右,理论上物理内存是足够,只可能是虚拟机的其他内存不足。
启动异常日志
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 1364176 bytes for Chunk::new
# An error report file with more information is saved as:
# D:\tomcat8.0\bin\hs_err_pid5220.log
#
# Compiler replay data is saved as:
Disconnected from the target VM, address: '127.0.0.1:49241', transport: 'socket'
# D:\tomcat8.0\bin\replay_pid5220.log
Disconnected from server
从Native memory allocation (malloc) failed to allocate 1364176 bytes for Chunk::new 这句话可以看到是本地内存分配不足。
涉及本地内存的主要是,native方法,如果项目中没有使用本地方法调用,那么最大可能就是thread自身的了。
也就是线程过多导致的本地内存不足。(Java 的线程是映射到操作系统轻量级进程上的,其操作均是native的)
线程在启动的时候会有一个线程栈,是线程私有的,线程执行完毕会释放,而方法是栈中的栈帧,如果我们明确知道自己的线程(方法)不可能需要很多的空间,那么最简单的方法就是将这个参数设置的小一点。
JVM默认thread stack的大小为1024,实际上当thread stack的大小为128K 或256K时是足够的。IDEA中在 启动配置中 JVM栏 增加 -Xss128k ,重新启动Tomcat即可。
还有一种就是减小堆分配的初始化值,若后续不足JVM会自动增加直至最大值,按照性能对比来说,一开始就分配所需要的空间更加高效。而栈大小不会改变,设定的大小很关键,这个值不太好精确估计。两种方法各有优劣。