使用Xmx操纵JVM的内存限制

时间:2018-11-02 15:59:14

标签: java memory-management jvm

拥有如此简单的应用程序

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        System.out.println("Enter a number: ");
        int n = reader.nextInt();
        reader.close();
    }
}

我使用不同的Xmx参数运行它(请记住,JConsole已注入到进程中)

  • -Xmx1M无法运行
  • -Xmx2M错误
  • -Xmx4M什么都不会打印
  • -Xmx6M及更高版本-将运行

JConsole 向我显示了该应用程序的奇怪内存使用情况

如果使用-Xmx8M运行

  • 已使用3.0MB
  • 已投入8.4MB
  • 最大8.4MB

如果使用-Xmx16M运行

  • 已使用4.0MB
  • 已提交16.8MB
  • 最大16.8MB

并带有-Xmx32M

  • 已使用11.0MB
  • 投入了33.6MB
  • 最大33.6MB

尽管使用外部软件来测量内存消耗可能会对这些值产生一定的影响,但Java似乎仍然会吃掉您让它吃掉的所有东西,即使不是必需的。这是我最讨厌的Java的一部分,但是试图理解。

我的程序不需要但由于更改Xmx参数允许它而被JVM占用的内存会发生什么情况? 我可以使用与Xmx参数不同的方法来影响“丢失”的内存量吗?

1 个答案:

答案 0 :(得分:1)

  

即使不需要,Java也会吃掉您让它吃的所有东西。

Java不会主动清理内存。如果给它内存,它将期望使用它来减少CPU消耗。

  

我可以使用与Xmx参数不同的方法来影响“丢失”的内存量吗?

您可以减小最小尺寸,可以控制最小尺寸的增长速度。实际上,有超过500个参数可用于控制GC,但是通常建议您设置尽可能少的参数,除非您真的知道自己在做什么,以避免碰到如果不理会它们便不会发生的问题。

要记住的关键一件事是:时间就是金钱,而记忆力就是金钱。在某些时候,浪费一点内存是不值得的。

基于开发人员的平均工资和PC内存的平均价格(您组织的成本会有所不同)

1 day - 16 GB
1 hour - 2 GB
5 minutes - 160 MB
1 minute - 32 MB

如果您花费超过一分钟的时间来保存少于32 MB的内存,那可能是不值得的。

  

这是我最讨厌的Java的一部分,

我讨厌滥用单位,但实际上我应该学会克服它

m - milli
M - Mega
b - bits
B - Bytes
1 MB = 8 Mb = 1000000000 mB = 8000000000 mb