Java Web应用程序:高堆使用率和阻塞线程-同时

Java Web应用程序:高堆使用率和阻塞线程-同时,java,multithreading,jakarta-ee,memory,out-of-memory,Java,Multithreading,Jakarta Ee,Memory,Out Of Memory,我有一个Java/JavaEEWeb应用程序 通常,当我看到应用程序由于高堆使用率(或内存不足的情况)而停止响应时,我还看到线程被阻塞(通过线程转储)——通常是在日志记录上,也可能是在随机事件上 我在web应用程序中多次看到这种情况 内存不足场景与阻塞线程之间是否存在相关性?是的,OOM与阻塞线程之间存在直接相关性。这是因为线程试图在堆上分配内存,但无法获得足够的内存。大多数情况下,您会看到围绕日志记录、类加载、资源查找和IO的阻塞线程。这些都是需要新内存分配的情况。是的,存在相关性。虽然线程共

我有一个Java/JavaEEWeb应用程序

通常,当我看到应用程序由于高堆使用率(或内存不足的情况)而停止响应时,我还看到线程被阻塞(通过线程转储)——通常是在日志记录上,也可能是在随机事件上

我在web应用程序中多次看到这种情况


内存不足场景与阻塞线程之间是否存在相关性?是的,OOM与阻塞线程之间存在直接相关性。这是因为线程试图在堆上分配内存,但无法获得足够的内存。大多数情况下,您会看到围绕日志记录、类加载、资源查找和IO的阻塞线程。这些都是需要新内存分配的情况。

是的,存在相关性。虽然线程共享堆,但它们有自己的堆栈。两者都是从可用内存分配的内存。一个线程可能正在做一些您在案例日志中提到的工作。对于日志记录,线程可能在内存中保存一些日志,并将尝试将它们放入日志文件中。由于存在不同的日志线程,因此它们将轮流等待访问日志文件。如果线程等待文件的时间过长,那么它们将在内存中长时间保存日志数据。如果这种情况继续发生,将有太多的线程和太多的数据在内存中。当有人试图获取内存而没有可用内存时,JVM最终会遇到内存不足的问题。

是的,因为线程是代码执行的地方,代码需要内存。Java是面向对象的,因此创建新对象是非常常见的。当JVM出现内存问题时,会尝试分配更多内存块,直到可以授予内存为止

与外部系统(I/O)接口是线程阻塞的常见点,因为这些线程通常涉及内存分配的大小良好的块(例如用于格式化的字符串缓冲区、由类加载器读取.class文件、为数据库结果集生成对象)

这是排除OutOfMemory错误非常困难的原因之一。当堆空间不足/耗尽时,每件事情都会减慢并中断,从而难以区分症状和原因