昨天晚上发出来的邮件,有一台服务器又宕掉了,无法连接登录。今天去服务器上看了一下,发现服务器是正常的,但是jvm内存已经被使用完了,最后的log是java.lang.outofmemoryerror java heap space,时间是昨天晚上接近零点,就是说昨天晚上接收到这些请求报出这些 错误之后就不再处理请求了。
之前怀疑是由于jdk版本的原因,导致的是堆外内存泄露,从而导致我们的服务器宕机。然而现在从我们观察到的日志来看,并不是堆外内存导致的服务无法使用,而是Java虚拟机内部内存无法回收导致的(在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息)。那么也就是说,应该不是jdk版本中堆外内存回收机制的bug导致的我们系统崩溃,而是我们的代码中确实存在不合理的代码,导致Java虚拟机内存资源被持续占用得不到释放。
上面这个报出此异常的条件是从网上搜索得来的,需要从其他地方进行查证后再确认。
需要仔细研究一下Java虚拟机内存的分配、使用机制,对此足够的熟悉才能从这些现象中就找到触发这些问题的根本可能原因,不像现在两眼一抹黑,完全无头绪让人牵着走。这感觉太难受了。
之前的使用不同jdk版本进行压力测试的计划继续执行(原来这个计划应该是为了观察是否有高版本比低版本更好的堆外内存回收机制处理方法的,虽然我现在觉得这个测试已经意义不大,但是现在主导人将这个计划的目标定位为确定高版本jdk比低版本整个有更好的gc机制),正好这个计划执行期间有非常多的空余时间,我趁这个机会阅读一些Java虚拟机对于内存的管理方法相关的内容,尽量也了解一些Linux对于内存的管理机制。这两块都太不熟悉。
对于java.lang.outofmemoryerror java heap space这个错误的解决方案,这篇博文比国内搜到的大多数内容都好太多《http://blogs.opcodesolutions.com/roller/java/entry/solve_java_lang_outofmemoryerror_java》。
留:《http://outofmemory.cn/c/java-outOfMemoryError》
近期评论