网站首页 > java教程 正文
小明看着面前的这盘10块钱的豪华番茄鸡蛋浇头餐,心里狠狠地想:“就算这个月超预算,明天也要加个鸡腿,升级成极品帝王餐,解解馋”。
正要开动,一阵急促的铃声从手机上传来,他低头一看,是项目经理打来的,顿时就是一惊,一股不好的预感从心头升起。刚点了接听键,大吼声就从听筒里传了出来:“赶快回来,系统崩了,立刻,马上......”。
小明看着那一点没动的豪华餐,不禁一阵心疼,无奈的狠狠地扒拉了一大口,火急火燎的就往回赶。一进办公室,就看见项目经理黑着脸,看着一群人手忙脚乱的忙活。小明顾不上打招呼,赶紧坐上自己的座位,开始鼓捣。
经过两个小时的奋战,小明担心的事情终于发生了,问题真的出在自己这儿,他不禁一阵头晕目眩。但现在还不是晕倒的时候,必须找出真正的原因,为什么自己写的这个接口,竟然会莫名其妙的总是时不时的超时呢?
SecureRandom,小明看着这个接口里唯一的另类,“罪魁祸首会不会就是它”。但是他实在不知道错在哪里,项目经理也不知道。他灵机一动,面向百度编程,就求助于百度吧。
“熵”,他看到这个字,一头雾水,“这是个什么玩意?熵池又是什么玩意?”
“熵指混乱程度。熵池是一种计算机系统内部的状态,或者说计算机系统内部的混乱程度,包含所有可能的随机性的来源。它是随机数生成器的核心。linux系统通过收集计算机系统的各种噪音,如鼠标移动,键盘敲击,网络数据传输等,把这些因素产生的熵存入熵池,为随机数生成器提供更加高质量的随机数。”
“但由于linux服务器所处的环境太安静了,比如没有用户活动,导致熵产生的不够,熵池中的熵值不足,随机数生成器需要等待足够的熵值才能产生随机数。”
“随机数有两种,一种是伪随机数,一种是安全随机数。java的SecureRandom就是安全随机数,它需要使用linux系统的熵池。当熵池中的熵值不足时,会阻塞,长达5、6分钟。可以用cat /proc/sys/kernel/random/entropy_avail查看linux的熵池。”
小明恍然大悟,赶紧到服务器上执行了一下命令,乖乖不得了,只有23。怪不得!他的接口每次调用都会因此阻塞,时间长了,服务器资源不足就挂了,波及了其他服务器,整个系统就崩溃了。那怎么办呢?小明赶紧继续往下看。
“解决办法有3种:一种是加java启动参数,-Djava.security.egd=file:/dev/./urandom;一种是修改jvm参数,找到$JAVA_PATH/jre/lib/security/java.security,将其中的securerandom.source=file:/dev/urandom替换成securerandom.source=file:/dev/./urandom,当然更好的方法是补熵,安装增熵服务haveged或rng-tools。”
小明看到这里,赶紧到服务器上安装haveged,当haveged服务启动之后,他再次查看熵池,发现值已经在1000以上了。整个系统也正常了。
小明长长的吁了一口气,终于搞定了,他这时才发现身上的衣服都已经被汗浸透了。他偷偷地看了眼项目经理,居然发现他不再生气了,反而露出了欣喜的笑容。“走,还愣着干什么,知道你中午没吃饭,我请你吃鸡腿”。
“耶......”
猜你喜欢
- 2024-09-08 JavaWeb项目各种随机数主键ID的代码范例供大家参考学习
- 2024-09-08 Java中List集合有哪些特性?Java开发常见集合
- 2024-09-08 这么一篇.Java性能权威指南.不需要好好的了解一下吗?
- 2024-09-08 一篇文章彻底弄懂CAS实现SSO单点登录原理
- 2024-09-08 Java练习:输出并统计水仙花数、猜数字小游戏
- 2024-09-08 Javaweb代码创建JESESSION32位随机数及session最大不活动时间
- 2024-09-08 Java 中生成一组不重复随机整数的简便方法
- 2024-09-08 JDK 17 - Java 17 的新特性速览(java的什么特性实现了软件开发人员一次编写)
- 2024-09-08 Java教学:Integer、日期类、数字类、随机数、枚举,一次搞定!
- 2024-09-08 Java程序员面试宝典:用这100个问答搞定面试官
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)