如果你想看看Java的如何溢出,你只要写一个程序不断的申请内存,而且不释放就可以了。内存不停增加,Java程序就会崩溃,并且给出出错信息。如果运行的时候,给Java添加了运行参数,还可以观看Java GC的救火过程,从而了解GC的过程。
所以说,Java的稳定性,除了Java自身,还有程序方面的决定因素。
如果有一个Objec虽然没有用了,但是他和Root Object总是存在连接,那么系统就不会回收。如果还不停的创建这样的Object,Java程序占用的内存就会不断增加,最终就像一个黑洞一样,导致系统的崩溃。
这是Java程序不稳定的一个原因!
另外一个事情,是关于国产某X康的打卡机。
这种打卡系统提高了Java SDK,同时还有C++和C#的SDK。最先的选择是Java,但是运行一段时间之后发现,总是丢数据,有的人明明来上班了,还且在打卡机前面打了卡,但是总是没有数据。这种情况造成的后果就是,有的人甚至都和打卡机来个合影,以方便有一天自证清白。
当时,读取打卡数据的程序就是Java。
后来,把打卡程序进行了改写,改为C#。运行方式也作了改变,从原来的SpringBoot定时运行,改为Windows的定时任务,运行C#。
出人意料的是,居然没有出现丢失数据的情况了。
这个情况,很让人疑惑。一方面考虑是Java和打卡机的接口出现了问题。因为打卡机器原生还是C/C+打底。如果Java和JNI接口出现问题,就容易出现数据丢失。另外一个考虑是SpringBoot的定时接口有问题,Java代码没有执行;最后一个考虑是SpringBoot的长时间运行,JVM出现运行错误,导致程序出错。
虽然最后也没有查明白,因为用C#改写了之后,就没有出现过“丢失数据”的情况。
第三个时期,是有些特定程序的问题。
我们有一台WebLogic服务器,他是PLM软件的运行平台。
近期,Oracle就JDK进行公司严查,如果使用了超过221的JDK8,就会按照公司人数来收取安装费用。
针对这种情况,我们就对WebLogic的基础平台进行了改变,从原来的Oracle官方的Java11改变为OpenJdk11。
改变之前,其实是充满信心的。因为OpenJDK就是Oracle JDK11的非官方实现,基础代码相同,但是去掉了Oracle JDK的私有组件,从而不受Oracle版权政策的影响。
基于上面的考虑,我们转换到了OpenJDK。
但是事情并没有那么顺利。
我们发现,WebLogic里面的PLM下午就会出现错误,容易出现客户端窗口空空的情况,没错,就是一个什么也没有的窗口。后台的Console也报错。
这种情况持续了一个星期的时间。
为了应对这种情况,每天早上都需要重启服务器,当时依然撑不过全天,下午还是报错。
不胜其烦的我们,把JDK替换回去。
神奇的事情发生了,WebLogic正常了。
从这里可以看到,Oracle JDK和Oracle WebLogic是配合更好。
总结一下:
1、Java程序决定程序的稳定性,JDK只是平台。程序写的不好,JDK也没办法。
2、Java和外部sdk交互,未必契合性很好。
3、大型Java程序,特别是Oracle自家的产品,Oracle JDK更佳。
我是明月,
天天研究Linux和Java!