有没有工具可以知道我的java应用程序使用了多少本机内存? 我从我的应用程序中经历过outofmemory: 目前的设置是: -Xmx900m
计算机,Windows 2003 Server 32位,RAM 4GB。
在Windows上将boot.ini更改为/ 3GB也会有什么不同? 如果设置为Xmx900m,可以为此进程分配多少最大本机内存?是1100米吗?
答案 0 :(得分:12)
(在我的情况下,我使用java 8)
添加到命令行:-XX:NativeMemoryTracking=summary
然后启动jcmd <PID> VM.native_memory
你应该得到这样的东西:
Total: reserved=3863657KB, committed=1679977KB
- Java Heap (reserved=1843200KB, committed=824320KB)
(mmap: reserved=1843200KB, committed=824320KB)
- Class (reserved=1311974KB, committed=298726KB)
(classes #52579)
(malloc=5350KB #76340)
(mmap: reserved=1306624KB, committed=293376KB)
- Thread (reserved=263278KB, committed=263278KB)
(thread #256)
(stack: reserved=262140KB, committed=262140KB)
(malloc=839KB #1280)
(arena=299KB #510)
- Code (reserved=278521KB, committed=164773KB)
(malloc=28921KB #37983)
(mmap: reserved=249600KB, committed=135852KB)
- GC (reserved=114897KB, committed=77093KB)
(malloc=13729KB #67925)
(mmap: reserved=101168KB, committed=63364KB)
- Compiler (reserved=461KB, committed=461KB)
(malloc=330KB #1138)
(arena=131KB #3)
- Internal (reserved=13877KB, committed=13877KB)
(malloc=13845KB #72978)
(mmap: reserved=32KB, committed=32KB)
- Symbol (reserved=28871KB, committed=28871KB)
(malloc=24740KB #275452)
(arena=4131KB #1)
- Native Memory Tracking (reserved=8393KB, committed=8393KB)
(malloc=45KB #523)
(tracking overhead=8348KB)
- Arena Chunk (reserved=184KB, committed=184KB)
(malloc=184KB)
有关详细信息,请参阅https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html
答案 1 :(得分:3)
This article提供了一些关于寻找本机内存问题的好信息,并解释了如何耗尽本机内存。
答案 2 :(得分:1)
对于那些后来的人,VMMap会给你答案。它将显示本机内存分配。根据我的经验,我认为在OS分配块中最小量为124K的-Xss被忽略。操作系统分配一直是双倍的块,直到它达到1GB(然后你就完成了。)如果你不能减少你的线程,那么尝试减少你的最大堆和最大permgen设置或尝试/ 3GB开关。
答案 3 :(得分:0)
免费进程空间略小于2GB - Xmx。 (假设是Sun JVM)您必须将您的permgen空间添加到Xmx,然后为操作系统的内核填充减去大约150-200MB左右。如果真正的问题是真正的内存不足,3GB开关或减少你的Xmx和PermGen空间应该可以减轻它。有时候,至少在Windows上,操作系统只需要花费比JVM愿意等待分配线程更长的时间,问题更多的是你发送线程产生垃圾邮件而不是耗尽内存。你应该有几千个线程的内存空间。在它放弃之前你有多少人?
还有一个-Xss开关来控制JVM要求的线程堆栈的大小。 YMMV如果更改它实际上在Windows上做了什么。
答案 4 :(得分:0)
Native Memory是JVM通常用于内部操作和执行JNI代码的区域。 JVM使用本机内存进行代码优化,并加载类和库以及中间代码生成。 本机内存的大小取决于操作系统的体系结构和已提交给Java堆的内存量。本机内存是一个进程区域,其中加载JNI代码或加载JVM库或加载本机性能包和代理模块。 没有JVM选项可用于调整Native Area的大小。但我们可以使用以下公式计算它:
NativeMemory =(ProcessSize - MaxHeapSize - MaxPermSize)
找到了这个答案 5 :(得分:-1)
如果您使用例如jvisualvm(它随jdk一起提供),您可以看到您的应用程序使用了多少内存,您也可以更详细地对其进行分析。