【发布时间】:2018-11-02 15:59:14
【问题描述】:
有这么简单的应用程序
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 参数的方式来影响“丢失”内存的数量吗?
【问题讨论】:
-
"这是我最讨厌的 Java 的一部分,..." 我猜,当运行非 Java 软件时,比如您选择的网络浏览器,您只需提供所需的千兆字节数,而无需询问它实际需要多少...
-
不一样的;当我编写一个 hello world 应用程序时,我编写了一个 hello world 应用程序。它不同于处理网络协议、流、缓存等的应用程序。预计大型软件会消耗大量内存,反之则不然
-
说真的。我敢打赌,99% 的开发人员无法预测他们的应用程序,尤其是一个普通的 hello world 应用程序需要多少内存。如果被问到,他们会四舍五入。 慷慨地。例如,即使是“hello world”应用程序也依赖于操作系统的抽象。它写入一个“文件”,结果是一个控制台(终端仿真)。不同的环境可能会将不同的库加载到您的应用程序中。您正在关注堆内存,对于如此小的应用程序来说,这是内存中最小的部分。例如,您知道分配了多少堆栈空间吗?
标签: java memory-management jvm