Java项目上线遇到两个问题
====================================================
问题一:在jvm中一次性启动52个进程,每次只能启动20多个然后就报错了,生成了一个hs_err_pidxxx.log 错误日志文件。
--下面是启动的输出日志
# There is insufficient memory for the Java Runtime Environment to continue.
# Cannot create GC thread. Out of system resources.
# An error report file with more information is saved as:
# /hs_err_pid64902.log
com.xx.xx.lsnr.Listener trade_xx_bat_74
自己查看主机的内存free还很充足,不知道为什么java进程启动报错内存不够。我一直以为是jvm有设置使用系统内存的最大容量。 启动脚本设置了进程最大使用的堆内存为256MB 54个进程启动最大使用内存应该13G 足够了,实际上主机空闲内存远远超出13G。一直在查找设置JVM使用系统内存怎么设置? 这是一个错误的方向!!!
最后请教了一下平台组的同事,最后搞定了。
原因是:
内核参数的问题
需要调整下系统最大打开文件数、进程数
继续查询了一下ulimit 这个命令 茅塞顿开……
--进程启动脚本 循环执行52次
JAVA -Xms128M -Xmx256M -classpath com.xx.xx.lsnr.Listener trade_xx_bat_74
设置了
-Xms128m JVM初始分配的堆内存
-Xmx256M JVM最大允许分配的堆内存,按需分配
====================================================
问题二:52个进程是启动起来了。但是有一种卡主的感觉,因为进程启动完毕会读取数据库配置生成一个log文件。来实时输出项目的运行日志。继续观察会发现偶尔也会生成一个日志文件,生成的时间不定。
52个进程正常,但是日志文件都没有生成很奇怪,过一阵子生成一个,过一阵子生成一个很奇怪。从来没遇到过。通过ps -ef|grep 查看进程是这些java进程确实是存在但是进程里面的java代码却不运行。
后来通过增加输出语句定位到在生成 Properties 对象时就卡住了。
// log4j配置参数信息,没有指定则不特殊处理
Properties log4j = new Properties();
Properties lsnrConfig = new Properties();
再往下就是加装Spring配置文件。连接数据库读取配置放入到Properties 对象。
最后解决方案:增加-Djava.security.egd 参数为 file:/dev/./urandom 搞定
JAVA -Xms128M -Xmx256M [color=red]-Djava.security.egd=file:/dev/./urandom[/color] -classpath com.xx.xx.lsnr.Listener trade_xx_bat_74
file:/dev/./urandom 等效于 file:/dev/urandom只是为了躲避java的检查因为java代码里面写死了 如果设置值是file:/dev/urandom 则去读file:/dev/random
random是阻塞的,而urandom 是非阻塞的。对于安全性不高的应用用urandom 足以。
参考资料:
http://zhidao.baidu.com/link?url=1gWoG-a6SYacVYAwiDY5JW863_gmSQQvoRh_vGNHxOruMxUVtJKEt4ueMM_IicRyjOmumEvI566nPfX0AOnEPRckhFFx8cCnG9Xo9WJ5p4a
http://blog.csdn.net/raintungli/article/details/42876073
理解不是很深刻,仅供参考
====================================================
问题一:在jvm中一次性启动52个进程,每次只能启动20多个然后就报错了,生成了一个hs_err_pidxxx.log 错误日志文件。
--下面是启动的输出日志
# There is insufficient memory for the Java Runtime Environment to continue.
# Cannot create GC thread. Out of system resources.
# An error report file with more information is saved as:
# /hs_err_pid64902.log
com.xx.xx.lsnr.Listener trade_xx_bat_74
自己查看主机的内存free还很充足,不知道为什么java进程启动报错内存不够。我一直以为是jvm有设置使用系统内存的最大容量。 启动脚本设置了进程最大使用的堆内存为256MB 54个进程启动最大使用内存应该13G 足够了,实际上主机空闲内存远远超出13G。一直在查找设置JVM使用系统内存怎么设置? 这是一个错误的方向!!!
最后请教了一下平台组的同事,最后搞定了。
原因是:
内核参数的问题
需要调整下系统最大打开文件数、进程数
继续查询了一下ulimit 这个命令 茅塞顿开……
--进程启动脚本 循环执行52次
JAVA -Xms128M -Xmx256M -classpath com.xx.xx.lsnr.Listener trade_xx_bat_74
设置了
-Xms128m JVM初始分配的堆内存
-Xmx256M JVM最大允许分配的堆内存,按需分配
====================================================
问题二:52个进程是启动起来了。但是有一种卡主的感觉,因为进程启动完毕会读取数据库配置生成一个log文件。来实时输出项目的运行日志。继续观察会发现偶尔也会生成一个日志文件,生成的时间不定。
52个进程正常,但是日志文件都没有生成很奇怪,过一阵子生成一个,过一阵子生成一个很奇怪。从来没遇到过。通过ps -ef|grep 查看进程是这些java进程确实是存在但是进程里面的java代码却不运行。
后来通过增加输出语句定位到在生成 Properties 对象时就卡住了。
// log4j配置参数信息,没有指定则不特殊处理
Properties log4j = new Properties();
Properties lsnrConfig = new Properties();
再往下就是加装Spring配置文件。连接数据库读取配置放入到Properties 对象。
最后解决方案:增加-Djava.security.egd 参数为 file:/dev/./urandom 搞定
JAVA -Xms128M -Xmx256M [color=red]-Djava.security.egd=file:/dev/./urandom[/color] -classpath com.xx.xx.lsnr.Listener trade_xx_bat_74
file:/dev/./urandom 等效于 file:/dev/urandom只是为了躲避java的检查因为java代码里面写死了 如果设置值是file:/dev/urandom 则去读file:/dev/random
random是阻塞的,而urandom 是非阻塞的。对于安全性不高的应用用urandom 足以。
参考资料:
http://zhidao.baidu.com/link?url=1gWoG-a6SYacVYAwiDY5JW863_gmSQQvoRh_vGNHxOruMxUVtJKEt4ueMM_IicRyjOmumEvI566nPfX0AOnEPRckhFFx8cCnG9Xo9WJ5p4a
http://blog.csdn.net/raintungli/article/details/42876073
理解不是很深刻,仅供参考