我是新来的Java,真的需要你的帮助。Java Outofmemory堆空间错误:如何从矢量中创建双端队列?
我目前正在使用一个队列,一个接收线程将数据放入这个队列,解析器读出这个。 但问题是接收器可能以令人难以置信的峰值速度接收,如例如。 3000 /秒,而解析器仅以100 /秒解析。
EDIT:I have checked, the queue first stays at 100 or so, and after ten seconds it starts to grow at 100 per second, and crashes at 2000 or so. Could it be possible that there is a memory leak?
我的代码(在一个紧密的循环)是
byte[] data = new byte[1024];
System.arraycopy(udpPacket.getData(), 0, data, 0, 1024);
queue.offer(data);
堆太快填满,我得到一个内存不足的异常。我想问题是队列是使用链表创建的,所有指针必须保存在堆中。
我知道一个C版本可以做同样的事情(使用缓冲区),但性能要好得多,但由于部署问题,我们只能使用Java。
既然讨论正在进行中,您可以指定接收哪些大写金额的数据或流TCP或UDP和最新是否传输的频率。这些信息对建议最佳实践是必要的。 – stacker 2010-02-02 12:35:29
看起来您正在进行大量复制。您可能想要包装您的数据作为输入流并传递。 – 2010-02-02 16:45:01
@stacker:我无法控制输入,我只能控制侦听器的采样。 @Nick:是的,我正在做很多复制,而且我不理解将数据封装为输入流。你能解释一下如何以及为什么输入流更好? – TiansHUo 2010-02-03 02:04:12