Java内存使用情况

3
我无法理解Java内存使用情况。我有一个应用程序,最大内存大小设置为256M。但是,在某个时间点上,我可以看到根据任务管理器它占用了高达700MB!毫无疑问,当这种情况发生时,所有其他应用程序都有点反应迟钝,因为它们可能被交换出去了。这是在WinXP上的JDK 1.6。有什么想法吗?
5个回答

2

你在 -Xmx 中指定的数量仅适用于用户可访问的堆内存空间,也就是您动态创建运行时对象的空间。

Java进程将使用更多的空间来满足自己的需求,包括JVM、程序和其他库、常量池等。

此外,由于垃圾回收系统的工作方式,分配的内存可能比堆中当前使用的内存要多,只是还没有被回收而已。

尽管如此,在现代系统上将程序最大堆设置为256MB有些低估了。对于较重的程序,通常可以请求至少1GB的堆内存。

正如你提到的,导致程序变慢的一个可能原因是分配给Java的一些内存被交换到磁盘上。在这种情况下,程序确实会开始磨盘,所以如果物理内存很少,请不要过度使用。在Linux上,您可以获取进程的页面缺失统计信息,我相信Windows上也有类似的方法。


2
配置的内存可供应用程序使用。它不包括以下内容:
  1. JVM大小
  2. 加载的Jars/Libs
  3. 本地库和相关的分配内存
这将导致图像更大。请注意,由于操作系统和JVM的工作方式,700Mb 可能在多个JVM之间共享(由于共享二进制映像、共享库等)。

最终结果表明,我的应用程序使用了JNA,而本地库是罪魁祸首。 - Demiurg

1

-Xmx选项仅限制Java堆大小。除了堆之外,Java还会为其他东西分配内存,包括每个线程的堆栈(默认为2kB,由-Xss设置),PermGenSpace等。

因此,取决于您启动的线程数,应用程序加载的类数以及其他一些因素,您可能会使用比预期更多的内存。

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


0

您是指堆heap吧?据我所知,有两个方面需要注意。Xms选项设置初始Java堆大小,而Xmx选项设置最大Java堆空间。如果堆内存超出了Xmx值,应该会出现OutOfMemoryException异常。


0

那虚拟页面怎么办呢?我认为Windows会将所有聚合的内容全部显示出来。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接