我正在使用 Oracle Java 在 Ubuntu 12.04.3 x64 VPS 上运行 Java 应用程序。几分钟后,该进程被操作系统杀死:“killed”出现在控制台中。
在崩溃之前,使用 TOP(几千兆字节的虚拟内存)可以看到内存使用过多。为了检查泄漏,我安装了 Java VisualVM 并通过 jstatd 远程连接到它。看不到泄漏迹象:
- 堆大小:10 MB
- 永久代空间大小:20 MB
- 主题:5
- 加载的课程:815
几次尝试后,hs_err_pid7071.log和hs_err_pid7057.log出现在应用程序目录中(链接)。
该应用程序使用了一些本机库。
我跑
jcmd 8749 VM.native_memory detail
了,得到了这个结果。VM 当时使用了大约 2 GB 的内存。
删除此行会使泄漏消失:
Kryo kryo = new Kryo();
return kryo.copy(gameWorld);