gpt4 book ai didi

Java 内存和 Windows

转载 作者:可可西里 更新时间:2023-11-01 09:30:00 25 4
gpt4 key购买 nike

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

基本上,我创建了一个普通的旧 java main 方法,其中有一个永无止境的 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 进程。我想了解的位是虚拟内存和物理内存。虚拟内存(私有(private)字节)似乎映射到请求的 jvm 大小,即 512MB。随着时间的推移,根据进程的配置文件,我假设物理内存(工作集)是进程使用的实际内存,因为它随着时间的推移逐渐增加,因为我的进程生成更多的字符串值并填满映射。它总是比 512MB 少很多。

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

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

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

这对性能不利吗?

有没有办法强制将所有内容都放在 RAM 中以获得更好的性能?

任何关于 Windows 上此类内容的好文章都会很棒。

最佳答案

Why is Java using Virtual Memory?

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

Isn't it all in RAM i.e Physical Memory?

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

Because I'm using Virtual Memory, does that mean it's swapping to disk?

没有。见上文。

Is that bad for performance?

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

  1. 发送到磁盘的虚拟内存页是最近最少使用的
  2. 有几种优化设计用于在 Windows 检测到页面即将被使用时从磁盘中拉回页面(即,如果您开始遍历映射中的键,Windows 将尝试拉回在迭代到达之前包含下一个键 block 的页面)

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

Is there a way for force it all to be in RAM for better performance?

您可以在Windows 中关闭页面文件。 Here's a Youtube video with instructions.

Any good articles on this kind of thing on Windows would be great.

关于Java 内存和 Windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14695770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com