我正在使用 32 个虚拟处理器和 32GB 内存的 Sun 服务器上进行网络爬取。
我打开了 1460 个线程来为我完成这项工作。我设置的运行时参数是-Xms2048
和-Xmx2048
。我已经运行了两次代码,但它在不同的点崩溃了。
> #
> # A fatal error has been detected by the Java Runtime Environment:
> #
> # SIGSEGV (0xb) at pc=0xff390f38, pid=3053, tid=7640
> #
> # JRE version: 6.0_15-b03
> # Java VM: Java HotSpot(TM) Server VM (14.1-b02 mixed mode solaris-sparc )
> # Problematic frame:
> # C [libc_psr.so.1+0xf38] memset+0x78
> #
> # If you would like to submit a bug report, please visit:
> # http://java.sun.com/webapps/bugreport/crash.jsp
> # The crash happened outside the Java Virtual Machine in native code.
> # See problematic frame for where to report the bug.
> #
>
编辑:我将线程数减少到 40 并在同一台服务器上运行它。在 RSS 的值超过 Swap 的值(两者都在 2150M 左右)时再次崩溃。换句话说,当内存超出限制时,它就崩溃了。然后我在我自己的带有 4G RAM 和双核处理器的 PC 上运行它。令我惊讶的是,到目前为止它一直做得很好。PC 上的内存使用量保持在 1.5G 左右,距离限制有点远。它一直如此稳定地运行,以至于 PC 上似乎有一种机制可以防止内存达到其极限。相比之下,它在 Sun 服务器上似乎失控了。
编辑:自从我升级到最新的 64 位 Java 以来,它还没有崩溃过。