2012-03-15 71 views
1

java -Xms显然不会影响java进程在运行过程中消耗的内存量。64位java 1.7是否忽略最小堆大小标志?

我有一个应用程序,从系统角度来看消耗约1Gb。我尝试设置-Xms2048m(和-Xmx4096m),我发现内存消耗完全没有变化。

热点文档声明堆大小由Xms值或默认值限定。

我能想到的唯一可能是这个进程无法获得连续的内存块,因此它抓住了所有可能的内存,然后再分配更多内存,或者Windows可能不会让它拥有那么多内存。 (64位Windows 7)

(我并不需要这个东西,它只是一些好奇,我注意到)

+0

您是否将-Mmx设置为适当的值(即.mx> ms)? – sw1nn 2012-03-15 23:09:54

+0

@ sw1nn - 是的,我将mx设置为4096米。我不认为如果ms> mx,虚拟机将启动。 – marathon 2012-03-15 23:17:10

+0

你如何测量Java进程的内存使用情况? – prunge 2012-03-15 23:21:10

回答

2

默认的内存使用Windows任务管理器显示你是不是在虚拟的进程分配内存空间。这个过程实际上写入了虚拟空间中的多少,而虚拟空间必须映射到实际内存上。如果在任务管理器中启用“Commit Size”列,将从流程的虚拟地址空间的角度显示实际被视为“使用”的内容。 (大致Xms + permsize +虚拟机和系统内容的大小本身。)

+0

我现在看到它了,谢谢,感动。 – marathon 2012-03-16 17:37:05

0

JVM需要连续的堆内存区域。这意味着它在启动时将最大大小分配为虚拟内存。这并不像听起来那么糟糕,因为操作系统只是为应用程序分配主内存(不是它分配虚拟内存时)(不是当它分配虚拟内存时)

如果查看像VisualVM这样的工具中使用的内存量,你甚至可以发现,即使有150-500MB的开销,它的尺寸也小于最小尺寸。这是因为Java不使用最小大小,如果它没有使用它。

取而代之的是,最小尺寸是指它仅在次要尝试清理内存的点以下。 (您可能会看到它执行次要GC)在大多数情况下,这意味着应用程序将很快使用最小大小。但是,“hello world”程序不会使用最小尺寸。

也许Windows不是让它有那么多的内存来启动与

的JVM将无法启动,如果它不能分配的最大尺寸为连续的块。 (这是在32位窗口的通病,使得限制可能是1.5 GB或低至1.2 GB)