3

今天注意到一些有意义的东西,但我无法准确解释语义。

基本上,我创建了一个普通的旧 javamain方法,其中有一个永无止境的 while 循环。在这个循环中,我创建了一些字符串并将它们放入 HashMap 中。我真正想要的是一个在一段时间内运行并建立它的内存利用率的进程。

public class Test {

public static void main(String[] args) throws InterruptedException {
    final HashMap<String, String> names = new HashMap<String, String>();
    while(true) {
        names.put(new Date().toString(), "lskjflksjdflksjdflkjsieurlskjflksn,kdsgkjsdlkfjslkdjfs");
        Thread.sleep(50);
    }
}

}

该过程从 开始-Xms512m -Xmx512m

启动后,我可以使用它procexp.exe来查看我的 java 进程。我试图理解的位是虚拟内存和物理内存。虚拟内存(私有字节)似乎映射到请求的 jvm 大小,即 512MB。从进程随时间推移的配置文件来看,我假设物理内存(工作集)是进程使用的实际内存,因为随着我的进程生成更多字符串值并填满地图,它会随着时间的推移而逐渐增加。它总是远小于 512MB。

所以我的问题是,为什么 Java 使用虚拟内存?

不都是在 RAM 中,即物理内存吗?

因为我使用的是虚拟内存,这是否意味着它正在交换到磁盘?

这对性能不利吗?

有没有办法强制它全部在 RAM 中以获得更好的性能?

任何关于 Windows 上这类事情的好文章都会很棒。

4

2 回答 2

2

为什么Java使用虚拟内存?

所有用户应用程序都使用虚拟内存与操作系统内存进行交互。由操作系统将其映射回物理 RAM/磁盘(通过页表)。因为您使用 -Xms512m 启动了 JVM,它将在启动时请求 500 MB 的虚拟内存空间,但操作系统选择不为此保留 500 MB 的物理 RAM,因为它可能永远不会被使用。

不都是在 RAM 中,即物理内存吗?

除非你的机器使用了很高的百分比(>75% 左右)它的所有物理 RAM 并且基于 JVM 的应用程序最近访问了它的一些数据,否则 JVM 将全部在 RAM 中。

因为我使用的是虚拟内存,这是否意味着它正在交换到磁盘?

不,见上文。

这对性能不利吗?

在将数据分页到磁盘的应用程序中,分页可能不利于性能。Windows 将尝试通过以下几种方式最小化这种影响:

  1. 发送到磁盘的虚拟内存页面是最近最少使用的页面
  2. 如果 Windows 可以检测到它即将被使用,则有几个优化旨在从磁盘拉回页面(即,如果您开始遍历地图中的键,那么 Windows 将尝试拉回包含迭代到达之前的下一个键块)

此外,正如我所提到的,您很可能不会分页到磁盘。

有没有办法强制它全部在 RAM 中以获得更好的性能?

您可以在 windows 中关闭页面文件。 这是一个带有说明的 Youtube 视频。

任何关于 Windows 上这类事情的好文章都会很棒。

于 2013-02-04T21:22:19.103 回答
1

对于 32 位计算机上的每个进程,可寻址的内存为 4GB,计算机是否有 4GB 的实际 RAM 内存并不重要。

例如,如果您的计算机有 2GB 的 RAM,对于 JVM,它看起来就像有 4GB 的内存。另外 2GB 内存来自将内存映射到 HDD 中的文件(这是虚拟内存)。

如果有多个进程在运行,对于每个进程来说,它似乎是计算机上唯一运行的进程,具有 4GB 的可寻址内存。由于 JVM 不会是唯一运行的进程,因此操作系统中的内存管理器可能会决定将未使用内存的内容推送到虚拟内存文件中。这取决于操作系统来决定。

由于它正在交换到磁盘,因此性能滞后会很明显(除非它是固态硬盘)

于 2013-02-04T21:20:17.097 回答