Java OutOfMemoryError,即使有足够的可用内存
我得到了Java OutOfMemoryError,即使有足够的可用内存,java,out-of-memory,ulimit,Java,Out Of Memory,Ulimit,我得到了java.lang.OutOfMemoryError错误,即使我还有足够的可用RAM。我的内存转储在200MB到1GB之间,而我的服务器有24GB的RAM。我设置了-Xmx12288m-Xms12288m 此外,当我尝试登录到服务器时,我经常会 -bash: fork: retry: Resource temporarily unavailable -bash: fork: retry: Resource temporarily unavailable -bash: fork: retr
java.lang.OutOfMemoryError
错误,即使我还有足够的可用RAM。我的内存转储在200MB到1GB之间,而我的服务器有24GB的RAM。我设置了-Xmx12288m-Xms12288m
此外,当我尝试登录到服务器时,我经常会
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: Resource temporarily unavailable
我将其缩小到下面的代码片段:
import org.snmp4j.Snmp;
import org.snmp4j.transport.DefaultUdpTransportMapping;
long n = 0;
while (true) {
DefaultUdpTransportMapping transport = null;
try {
transport = new DefaultUdpTransportMapping();
transport.listen();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
// } finally { // (*) I forgot this
// transport.close(); // (*) I forgot this
}
n++;
double freeMemMB = Runtime.getRuntime().freeMemory() / 1024 / 1024;
System.out.println("Created " + n
+ " DefaultUdpTransportMappings. Free Mem (mb): "
+ freeMemMB);
}
输出(在我的开发人员机器上,使用mvn exec:java
):
我发现我得到了错误,因为我没有关闭DefaultUDPTTransportMapping。启用finally{…}
块可以解决问题。现在我想知道我达到了哪些限制(如果不是可用内存的数量的话)。服务器上的ulimit是:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 191968
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 1024
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
在我的开发者Mac上:
-t: cpu time (seconds) unlimited
-f: file size (blocks) unlimited
-d: data seg size (kbytes) unlimited
-s: stack size (kbytes) 8192
-c: core file size (blocks) 0
-v: address space (kbytes) unlimited
-l: locked-in-memory size (kbytes) unlimited
-u: processes 709
-n: file descriptors 2560
我达到了哪一个限制?java.lang.OutOfMemoryError:无法创建新的本机线程是一条令人困惑的消息,因为它实际上与堆内存不足无关。因此,堆大小设置(Xmx和Xms)对这种情况没有影响。 当无法为应用程序创建新的操作进程时,会引发异常,原因可能是已达到最大processess/open文件句柄数,或者系统内存不足,无法创建新线程 关于ulimit设置,它可以是文件描述符的数量、堆栈大小或进程的数量。堆栈大小是每个线程的数量,线程数乘以堆栈大小就是使用的内存量
通常,在您的情况下,获取此异常意味着您的应用程序没有正确关闭其线程并保持系统进程。这就是为什么关闭trasnport为您解决了问题。您的
-Xmx
设置为什么?在本地,我有-Xmx1024m
。当我将其设置为-Xmx2048m
时,在2027 DefaultUDPTTransportMappings启动后,仍然会出现OutOfMemory错误。对于服务器上的生产过程,我设置了-Xmx12288m-Xms12288m
。生产进程的内存转储为58MB。请再次运行并将jconsole(随jdk提供)连接到正在运行的进程;如果您将visual gc插件添加到其中,那么它将显示每个堆区域中的分配大小和数量。可能重复@BenediktKöppel,您还应该阅读链接的博客条目
-t: cpu time (seconds) unlimited
-f: file size (blocks) unlimited
-d: data seg size (kbytes) unlimited
-s: stack size (kbytes) 8192
-c: core file size (blocks) 0
-v: address space (kbytes) unlimited
-l: locked-in-memory size (kbytes) unlimited
-u: processes 709
-n: file descriptors 2560