多个事件触发程序导致Java OutOfMemoryError?
假设线程中的一个函数在特定事件上被调用,并假设该函数的运行时间为1秒,假设该事件每秒发生5次,这会导致Java OutOfMemory错误吗 基本上,它是一个开放的线程,其作用是监听消息。传入的每条消息都将触发一个事件。我的问题是,如果这个线程接收到更多它可以处理的消息,会发生什么?这是否会构建一个事件队列来创建OutOfMemory异常?还是这些信息会被忽略 更新:多个事件触发程序导致Java OutOfMemoryError?,java,Java,假设线程中的一个函数在特定事件上被调用,并假设该函数的运行时间为1秒,假设该事件每秒发生5次,这会导致Java OutOfMemory错误吗 基本上,它是一个开放的线程,其作用是监听消息。传入的每条消息都将触发一个事件。我的问题是,如果这个线程接收到更多它可以处理的消息,会发生什么?这是否会构建一个事件队列来创建OutOfMemory异常?还是这些信息会被忽略 更新: 它一定是网络队列或某些套接字问题,通过网络接收到消息,并且在触发事件后,处理结果被写回网络。当我在网络上删除回写时,在处理之后,
它一定是网络队列或某些套接字问题,通过网络接收到消息,并且在触发事件后,处理结果被写回网络。当我在网络上删除回写时,在处理之后,问题就解决了。如果您有某种类型的事件循环,那么将有一个事件队列 如果创建的事件超过您的处理能力,则至少有两种可能性:
在这两种情况下,应用程序都将停止工作。这取决于“每秒5次侦听事件”的确切含义和实现。
示例: Java Swing EDT并每秒单击5次:
无论来自何处,都不会接收新的GUI事件。EDT忙时,GUI被锁定 Java NIO套接字选择器线程:
选择器将在消息传入时处理消息,在某个时候它们将溢出套接字缓冲区,连接将终止(或者如果操作系统注意到有时仍在读取,则会变得非常慢)
Java调度执行器每秒调用runnable 5次:
在上一次运行完成之前,不会安排运行。其他消息将被忽略 我自己的自定义事件处理线程,将它们放入基于堆的队列:
将耗尽堆,直到它耗尽内存或达到最大大小(在这一点上可能无论如何都会失败)因此,您要问的是启动5个线程是否会导致内存耗尽?我想如果它试图分配内存,但没有足够的可用内存,无论在什么情况下,您都会遇到此错误我不知道,如果收到消息并且线程正忙于处理旧消息,会发生什么情况。同样,假设线程运行需要1秒,并且每秒收到5条消息;不同的队列有不同的限制。“Java Scheduling Executor每秒调用runnable 5次:在上一次运行完成之前,您的runnable将不会被调度。其他消息将被忽略。“消息将被忽略还是放入队列中?@user3564557如果它是一个正在执行的runnable-甚至不会有消息,调度程序在完成上一步之前不会生成事件。看见