Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多个事件触发程序导致Java OutOfMemoryError?_Java - Fatal编程技术网

多个事件触发程序导致Java OutOfMemoryError?

多个事件触发程序导致Java OutOfMemoryError?,java,Java,假设线程中的一个函数在特定事件上被调用,并假设该函数的运行时间为1秒,假设该事件每秒发生5次,这会导致Java OutOfMemory错误吗 基本上,它是一个开放的线程,其作用是监听消息。传入的每条消息都将触发一个事件。我的问题是,如果这个线程接收到更多它可以处理的消息,会发生什么?这是否会构建一个事件队列来创建OutOfMemory异常?还是这些信息会被忽略 更新: 它一定是网络队列或某些套接字问题,通过网络接收到消息,并且在触发事件后,处理结果被写回网络。当我在网络上删除回写时,在处理之后,

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

基本上,它是一个开放的线程,其作用是监听消息。传入的每条消息都将触发一个事件。我的问题是,如果这个线程接收到更多它可以处理的消息,会发生什么?这是否会构建一个事件队列来创建OutOfMemory异常?还是这些信息会被忽略

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

如果您有某种类型的事件循环,那么将有一个事件队列

如果创建的事件超过您的处理能力,则至少有两种可能性:

  • 所有消息都将存储在该队列中,如果无法分配更多内存,将出现OutOfMemoryError

  • 如果应该创建新事件,队列也可能引发异常


  • 在这两种情况下,应用程序都将停止工作。

    这取决于“每秒5次侦听事件”的确切含义和实现。
    示例:

    Java Swing EDT并每秒单击5次:
    无论来自何处,都不会接收新的GUI事件。EDT忙时,GUI被锁定

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


    Java调度执行器每秒调用runnable 5次:
    在上一次运行完成之前,不会安排运行。其他消息将被忽略

    我自己的自定义事件处理线程,将它们放入基于堆的队列:

    将耗尽堆,直到它耗尽内存或达到最大大小(在这一点上可能无论如何都会失败)

    因此,您要问的是启动5个线程是否会导致内存耗尽?我想如果它试图分配内存,但没有足够的可用内存,无论在什么情况下,您都会遇到此错误我不知道,如果收到消息并且线程正忙于处理旧消息,会发生什么情况。同样,假设线程运行需要1秒,并且每秒收到5条消息;不同的队列有不同的限制。“Java Scheduling Executor每秒调用runnable 5次:在上一次运行完成之前,您的runnable将不会被调度。其他消息将被忽略。“消息将被忽略还是放入队列中?@user3564557如果它是一个正在执行的runnable-甚至不会有消息,调度程序在完成上一步之前不会生成事件。看见