gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 13:15:49 24 4
gpt4 key购买 nike

我正在开发基于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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com