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
-Djava.security.egd=file:/dev/./urandom -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
理解不是很深刻,仅供参考
分享到:
相关推荐
标注使用java.security.SecureRandom在策略Apigee Edge代理内生成随机数(int,UUID或高斯值),并使用该信息设置上下文变量。免责声明此示例不是正式的Google产品,也不是正式的Google产品的一部分。使用此标注您...
文件加密解密算法(Java源码) java,file,算法,加密解密,java源码 package com.crypto.encrypt; import java.security.SecureRandom; import java.io.*; import javax.crypto.spec.DESKeySpec; import javax.crypto...
ctx.init(null, new TrustManager[] { tm }, new java.security.SecureRandom()); // SSLConnectionSocketFactory ssf = new SSLConnectionSocketFactory( // ctx, NoopHostnameVerifier.INSTANCE); ...
java中使用公钥加密私钥解密原理. KeyGenerater类: public class KeyGenerater { private byte[] priKey; private byte[] pubKey; public void generater() { try { KeyPairGenerator keygen = KeyPairGenerator ...
可以生成随机数,稍微加以修改即可生成想要的位数
下载的Struts2源代码文件是一个名叫struts-2.1.0-src.zip的压缩包,里面的目录和文件非常多,读者可以定位到struts-2.1.0-src"struts-2.0.10"src"core"src"main"java目录下查看Struts2的源文件
java.security.NoSuchAlgorithmException: SHA1PRNG SecureRandom not available at sun.security.jca.GetInstance.getInstance(GetInstance.java:142) at java.security.SecureRandom.getInstance(SecureRandom....
主要介绍了Tomcat 启动时 SecureRandom 非常慢解决办法的相关资料,需要的朋友可以参考下
java8流源码 更随意。 更短的时间。 仍然是 java.util.Random 的一个实例。 BetterRandom 是一个库,可帮助您从伪随机数生成器 (PRNG) 及其种子源中获得最佳性能和最佳伪随机性。 有了它,您可以: 将具有改进的速度...
* 所以 SecureRandom securerandom = new SecureRandom(tohash256Deal(key)); 替换为下面内容 * 以适应linux的变化 */ KeyGenerator keygen=KeyGenerator.getInstance("AES"); SecureRandom securerandom = new ...
这将生成一个随机的十六进制字符串。 它的功能类似于 Ruby 中的 SecureRandom.hex 方法。 用法 var SecureRandom = require('securerandom'); console.log(SecureRandom.hex(12)); // prints a random 12 byte ...
实现Java服务器与客户端的通信c AES算法的实现有四种,例如CBC / ECB / OFB / CFB,四种Java和C实现。 AES算法和末尾的填充(padding),有三种Java填充NoPadding / PKCS5Padding的支持方式,并且C没有显式设置...
密码 使用SecureRandom和来自熵数据的安全密码生成器
DES加密解密(适用Windows和Linux系统)防止linux下解密失败,主要是SecureRandom 实现完全随操作系统本身的內部状态
使用以下两个存储库之一: repositories { jcenter() } 要么: repositories { maven { url 'https://dl.bintray.com/novacrypto/BIP/' } } 添加依赖项: dependencies { compile 'io.github.novacrypto:BIP...
带有SecureRandom补丁的Android加密库。.zip
该库提供与 Java 安全 API 集成的 SecureRandom 服务,用于访问 random.org 和 random.irb.hr(真随机数生成器,通过大气噪声或光子发射生成随机性)。