"Don't quote me on this"但是VIRT mem大致接近或超过分配的最大内存,但只要 memory being used 在物理内存中是空闲/可用的,JVM就不会引发内存异常 . 事实上,即使在操作系统上关闭了交换机,JVM启动时也不会根据物理内存检查最大内存 . 更好地解释了Java进程真正使用的虚拟内存here .
27
首先从下列之一获取进程ID,即列出的进程中的第一个数字:(或者只使用 ps aux | grep java ,如果您愿意的话)
jstat -gccapacity javapid (ex. stat -gccapacity 28745)
jstat -gccapacity javapid gaps frames (ex. stat -gccapacity 28745 550 10 )
上述命令的样本O / P.
NGCMN NGCMX NGC S0C
87040.0 1397760.0 1327616.0 107520.0
NGCMN Minimum new generation capacity (KB).
NGCMX Maximum new generation capacity (KB).
NGC Current new generation capacity (KB).
13 回答
有一个具有可视方面的命令行工具 - jvm-mon . 它是命令行的JVM监视工具,它消失了:
堆使用情况,大小和最大值
jvm进程
cpu和GC用法
顶级主题
工具打开时,指标和图表会更新 .
样品:
每个Java进程都有
pid
,您首先需要使用jps
命令找到它 .获得pid后,可以使用
jstat -gc [insert-pid-here]
查找垃圾收集堆行为的统计信息 .jstat -gccapacity [insert-pid-here]
将显示有关内存池生成和空间功能的信息 .jstat -gcutil [insert-pid-here]
将以每个发电容量的百分比表示每一代的利用率 . 有助于快速了解使用情况 .请参阅Oracle网站上的jstat docs .
jvmtop是一个命令行工具,它提供多个指标的实时视图,包括堆 .
VM概述模式的示例输出:
此命令显示配置的堆大小(以字节为单位) .
它也适用于EC2上的Amazon AMI .
试试这个在Ubuntu和RedHat中工作:
对于Windows:
对于Mac
所有这些命令的输出类似于下面的输出:
要以MB为单位查找大小,请将值除以(1024 * 1024) .
不使用大多数工具使用的JMX,您所能做的就是使用
并推断设置将来自命令行选项 .
默认情况下,如果没有JMX,您将无法获取动态信息,但您可以编写自己的服务来执行此操作 .
顺便说一句:我更喜欢使用VisualVM而不是JConsole .
晚会,但一个非常简单的解决方案是使用jpsstat.sh脚本 . 它提供了一个简单的直播 current memory , max memory 和 cpu use 细节 .
转到GitHub project并下载 jpsstat.sh 文件
右键单击 jpsstat.sh 并转到权限选项卡并使其可执行
现在使用以下命令运行脚本 ./jpsstat.sh
这是脚本的示例输出 -
任何方法都应该给你大致相同的数字 . 为所有代使用
-X..m
-X..x
分配堆始终是个好主意 . 然后,您可以保证并执行ps以查看传递了哪些参数并因此被使用 .对于实际的内存使用情况,您可以粗略地比较VIRT(已分配和共享)和RES(实际使用)与jstat值的比较:
对于Java 8,请参阅jstat,这些值实际上是指 . 假设你运行一个没有mmap或文件处理的简单类 .
$ jstat -gccapacity 32277 NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC 215040.0 3433472.0 73728.0 512.0 512.0 67072.0 430080.0 6867968.0 392704.0 392704.0 0.0 1083392.0 39680.0 0.0 1048576.0 4864.0 7225 2
$ jstat -gcutil 32277 S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 6.25 0.00 7.96 18.21 98.01 95.29 7228 30.859 2 0.173 31.032
Max :
NGCMX + S0C + S1C + EC + OGCMX + MCMX + CCSMX 3433472 + 512 + 512 + 67072 + 6867968 + 1083392 + 1048576 = 12 GB
(大致接近和低于VIRT记忆)
Max(Min, Used):
215040 + 512 + 512 + 67072 + 430080 + 39680 + 4864 = ~ 1GB
(大致接近RES内存)
"Don't quote me on this"但是VIRT mem大致接近或超过分配的最大内存,但只要 memory being used 在物理内存中是空闲/可用的,JVM就不会引发内存异常 . 事实上,即使在操作系统上关闭了交换机,JVM启动时也不会根据物理内存检查最大内存 . 更好地解释了Java进程真正使用的虚拟内存here .
首先从下列之一获取进程ID,即列出的进程中的第一个数字:(或者只使用
ps aux | grep java
,如果您愿意的话)然后在此处使用进程ID:
如果使用jrockit,请尝试使用jrcmd命令行工具 . 例如:
有关更多命令(如heap_diagnostics),请使用“jrcmd help”列出它们 .
https://blogs.oracle.com/jrockit/entry/why_is_my_jvm_process_larger_t
使用
top
命令是检查程序内存使用情况的最简单方法 .RES
列显示进程占用的实际物理内存 .对于我的情况,我在java中读取了一个10g文件,每次我得到outOfMemory异常 . 当
RES
列中的值达到-Xmx
选项中设置的值时,会发生这种情况 . 然后通过使用-Xmx
选项增加内存,一切都很顺利 .上述命令的样本O / P.
在http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html获取更多相关细节
就Java堆大小而言,在Linux中,您可以使用
要么
并查找-Xms,-Xmx以查找指定的初始和最大堆大小 .
但是,如果您感兴趣的Java进程缺少-Xms或-Xmx,则表示您的Java进程使用的是默认堆大小 . 您可以使用以下命令查找默认大小 .
或者特定的jvm,例如,
并查找InitialHeapSize和MaxHeapSize,以字节为单位 .