84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
通过java -X看到java -Xms的解释
-Xms<size> set initial Java heap size
但我测试发现,虽然我的机器内存只有1G,但通过 java -Xms3G -Xmx3G appname可以成功启动应用,那么这个分配机制是怎么的呢?
就是指定了-Xms 3G,但机器内存只有1G的情况下,是怎样分配内存的?
注:
# free -m|grep Swap Swap: 0 0 0
小伙看你根骨奇佳,潜力无限,来学PHP伐。
因为有操作系统的内存管理机制存在, 每个进程都会分配一个虚拟的地址空间(对应32位系统, 则是 4G 虚拟进程地址空间). 虚拟地址空间的有一部分内存地址映射到实际的物理内存中, 当进程所需要的内存大于实际的物理内存时, 则它的有一部分虚拟内存地址会映射到磁盘上. 由于这个机制的存在, 因此进程就好像可以使用到比实际物理内存还要大的内存空间.
4G
对于你的问题, JVM 需要 3G 的内存空间, 而实际机器只有 1G, 因此操作系统会将 JVM 进程中暂时用不到的内存存入磁盘(即 Swap space), 当 JVM 需要使用到另外一部分内存时, 则通过内存交换(Memory Swap), 将磁盘中的数据写入内存. 因此如果频繁发生 Memory Swap, 那么程序必然很慢.
Memory Swap
还有虚拟内存可以用。 你把虚拟内存调小或者直接禁用就不行了。
因为有操作系统的内存管理机制存在, 每个进程都会分配一个虚拟的地址空间(对应32位系统, 则是
4G
虚拟进程地址空间). 虚拟地址空间的有一部分内存地址映射到实际的物理内存中, 当进程所需要的内存大于实际的物理内存时, 则它的有一部分虚拟内存地址会映射到磁盘上. 由于这个机制的存在, 因此进程就好像可以使用到比实际物理内存还要大的内存空间.对于你的问题, JVM 需要 3G 的内存空间, 而实际机器只有 1G, 因此操作系统会将 JVM 进程中暂时用不到的内存存入磁盘(即 Swap space), 当 JVM 需要使用到另外一部分内存时, 则通过内存交换(Memory Swap), 将磁盘中的数据写入内存. 因此如果频繁发生
Memory Swap
, 那么程序必然很慢.还有虚拟内存可以用。
你把虚拟内存调小或者直接禁用就不行了。