今天注意到一些有意义的东西,但我无法准确解释语义。
基本上,我创建了一个普通的旧 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 上这类事情的好文章都会很棒。