Java内存使用

时间:2010-03-03 21:26:25

标签: java memory

我无法理解Java内存的使用情况。我有一个应用程序,最大内存大小设置为256M。然而,在某个时间点,我可以看到,根据任务管理器,它需要700MB!

毋庸置疑,所有其他应用程序在发生这种情况时都会有点无响应,因为它们可能已被换出。

WinXP上的JDK 1.6。有什么想法吗?

5 个答案:

答案 0 :(得分:2)

使用-Xmx指定的数量仅适用于用户可访问的堆 - 动态创建运行时对象的空间。

Java进程将根据自己的需要使用更多空间,包括JVM,程序和其他库,常量池等。

此外,由于垃圾收集系统的工作方式,可能会分配比堆中当前更多的内存 - 它还没有被回收。

所有这一切,将程序设置为256MB的最大堆,在现代系统上实际上是低调的。对于繁重的程序,您通常可以请求至少1GB的堆。

正如您所提到的,缓慢的一个可能原因是分配给Java的一些内存被交换到磁盘。在这种情况下,程序确实会开始搅拌磁盘,因此如果您的物理内存很少,请不要过分。在Linux上,您可以获取进程的页面未命中统计信息,我确信在Windows上有类似的方式。

答案 1 :(得分:2)

配置的内存可供应用程序使用。它不包括

  1. JVM大小
  2. 中加载的jars / libs
  3. 本机库和相关的已分配内存
  4. 这会产生更大的图像。请注意,由于操作系统和JVM如何工作,700Mb可以在多个JVM之间共享(由于共享二进制映像,共享库等)。

答案 2 :(得分:1)

-Xmx选项仅限制Java堆大小。除了堆之外,java还会为其他东西分配内存,包括每个线程的堆栈(默认为2kB,由-Xss设置),PermGenSpace等。 因此,根据您启动的线程数,应用程序加载的类数以及其他一些因素,您可能会使用比预期更多的内存。

另外,正如所指出的,Windows任务管理器可能会考虑虚拟内存。

答案 3 :(得分:0)

你的意思是堆好吗?据我所知,有两件事需要注意。设置初始Java堆大小的Xms选项和设置最大Java堆空间的Xmx选项。如果堆内存超出Xmx值,则应该有OutOfMemoryException。

答案 4 :(得分:0)

它占用的虚拟页面怎么样?我认为Windows会向您展示聚合的所有内容。