【发布时间】:2017-03-01 19:03:55
【问题描述】:
过去,我使用 C++ 或 C# 制作了大部分内存和性能关键应用程序,但随着 Java 语言的最新改进,我想我可以尝试一下。但是,我已经很早就陷入了 Java 中的内存管理。更具体地说,以下两点确实让我感到惊讶:
- 为什么我必须告诉 JVM 它可以使用多少内存?就不能随便用吗?我的意思是...拿走你需要的东西?
- 为什么对内存如此贪婪?将内存还给操作系统难道不能更慷慨一点吗?检查以下示例:
我上面提到的例子:
- 从 2048mb 的堆空间开始
- 在 T0 时刻,应用程序使用了 300mb 的 RAM
- 我打开一个 400mb 文件 -> 700mb RAM 并完全读取到一个字节数组
- 我将该数组包装到一个 ByteBuffer -> 700mb 的 RAM
- 我将它解密为第二个数组(不能原地完成)-> 1100mb 的 RAM
- 我关闭文件并清除 ByteBuffer 并将加密数组设置为 null -> 1100mb 的 RAM
- 我解析解密后的数组(产生的数据少一点)-> 1350mb 的 RAM
- 我将解密后的数组设置为 null -> 1350mb 的 RAM
- 我等了一会儿 -> 1350mb 内存
- 如果我用 1028mb 的堆空间重复上述操作 -> OutOfMemoryException
所以我的问题是:为什么 Java 会这样?更重要的是,我可以告诉 JVM 更……理智一点吗? C# 也是一种托管语言,但它能够正确释放未使用的内存。
【问题讨论】:
-
为什么你认为你必须告诉JVM它应该使用多少内存......?你来这里是为了吐槽吗?
-
我不确定你的评论,@Tunaki。我特别不想告诉它应该使用多少内存。我希望它尽可能少地使用它。它已经尽可能多地使用它,但遗憾的是它没有做第二个。