由多个事件触发器引起的Java OutOfMemoryError?

时间:2014-05-06 16:45:31

标签: java

假设线程中的函数在特定事件上被调用,并假设该函数的运行时间为1秒,并假设此事件每秒发生5次,是否会导致Java OutOfMemory错误?

基本上它是一个打开的线程,它的作用是收听消息。每条消息都会触发一个事件。我的问题是,如果这个线程接收到它可以处理的更多消息会发生什么?会构建一个会创建OutOfMemory异常的事件队列吗?或者会忽略这些消息?

更新: 它必须是网络队列,或者是一些套接字问题,通过网络接收消息,并且在事件被触发后,处理结果被写回到网络上。当我在网络上删除回写后,处理后问题就解决了。

2 个答案:

答案 0 :(得分:1)

这取决于你究竟是什么意思"每秒听5次活动"和实施 例子:

Java Swing EDT并每秒点击5次:
无论来自哪里都不会收到新的GUI事件。当EDT忙时,GUI被锁定。

Java NIO套接字选择器线程:
选择器将在消息进入时处理它们,在某些时候它们将溢出套接字缓冲区并且连接将被终止(或者如果操作系统注意到它仍然有时被读取则变得非常慢)

Java Scheduling Executor每秒调用runnable 5次:
在上一个完成之前,您的runnable将不会被安排。其他消息将被忽略。

我自己的自定义事件处理线程,将它们放在基于堆的队列中:
会耗尽堆,直到它耗尽内存或达到最大大小(此时可能会失败)

答案 1 :(得分:0)

如果你有某种事件循环,会有一个事件队列。

如果您创建的事件多于您可以处理的事件,则至少有两种可能性:

  1. 所有消息都将存储在该队列中,如果不能分配更多内存,则会出现OutOfMemoryError

  2. 如果要创建新事件,队列也可能抛出异常。

  3. 在这两种情况下,您的应用程序都将停止工作。