multithreading - RMI线程由于java.lang.OutOfMemoryError : Java heap space而终止

标签 multithreading rmi

我正在开发基于comp的应用程序。
在此应用程序中,有n个容器通过它们彼此提供的RMI服务相互通信。
在某个凭证点,由于内存不足错误,连接到我的容器的一个rmi线程丢失了连接,但是连接到我的容器的所有其他RMI线程都正常工作。

错误的堆栈延迟在这里:

Exception dispatching call to [655d565c:11f1d5dbae2:-7ffb, -3259564578052694518] in thread "RMI TCP Connection(21)-132.186.96.179" at Wed Jan 28 18:50:37 GMT+05:30 2009: 
java.lang.OutOfMemoryError: Java heap space
    at java.lang.reflect.Array.newArray(Native Method)
    at java.lang.reflect.Array.newInstance(Unknown Source)
    at java.io.ObjectInputStream.readArray(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
    at java.io.ObjectInputStream.readSerialData(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
    at java.io.ObjectInputStream.readSerialData(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at sun.rmi.server.UnicastRef.unmarshalValue(Unknown Source)
    at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
    at sun.rmi.transport.Transport$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

要查看此异常,我必须激活RMI特定的日志记录。发生此问题的原因是此终止线程的每个RMI调用都会向我的容器堆中添加一些数据。
并在某些时候超过了它的大小。

我对大家的问题是,如果我的容器的堆大小中的内存不足,为什么其他线程仍在工作?
请让我知道您是否有任何想法。

最佳答案

失败的通话是
java.lang.reflect.Array.newArray(Native Method)
这意味着失败的RMI线程正在尝试分配数组。不幸的是,它没有告诉我们它试图分配多大的数组。它试图分配一个巨大的数组,但失败了,那么这不会损害任何其他线程。对于失败的请求,与正在发出的其他请求相比,它必须分配多得多的内存,这有什么不同吗?

详细地说...假设由于某种原因,这个请求试图分配一个500兆的数组(并且堆上没有足够的内存)。好吧,该分配请求将失败。但是只要堆仍然有足够的内存来分配正常的分配请求,其他线程在创建新对象时就不会有问题。

关于multithreading - RMI线程由于java.lang.OutOfMemoryError : Java heap space而终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/487649/

相关文章:

java - DeepLearning4j k-均值非常慢

java - 这种传递和修改 HashMap 的方式是线程安全的吗

java - 我可以通过将 RMI 客户端和 RMI 服务器放在两端的不同包中来运行它们吗?

通过 Web 服务的 Java RMI?

2 台 PC 之间的 Java RMI

java - RMI:检查客户端崩溃

java - 远程服务器不响应客户端请求 - 使用 Java RMI

java - Gremlin:Blazegraph Remote

java - 如何并行而不是顺序执行多个模型?

c# - 创建在所有进程之间共享状态的多进程架构的最轻量级解决方案是什么