|
|
1
3
只是猜测:您可能正在使用非默认值
|
|
|
2
2
对不起,伙计们。错误的假设。 我已经习惯了用以实现默认最大堆大小的Sun Java实现的64 MB。但我用OpenJDK1.6进行测试。如果没有显式指定最大堆大小,则openjdk使用物理内存的一部分。在我的例子中是四分之一。我用的是4GB的机器。因此,四分之一是1 GB。这就是C和Java之间的区别。
遗憾的是,这种行为在任何地方都没有记录。我在查看OpenJDK的源代码时发现了它(
|
|
|
3
1
Java需要为其堆拥有连续内存,因此它可以将最大内存大小分配为虚拟内存。但是,这不会消耗物理内存,甚至可能不会消耗交换。我会检查你的常驻记忆增加了多少。 |
|
|
4
0
有很多因素需要考虑,尤其是在Java这样的语言上,Java运行在虚拟机上,垃圾收集是由Java运行时来处理的,因为有相当大的努力(我想)使用Java调用接口来在本地库中切换或执行本地方法。必须是一种在堆栈上分配空间、切换到本机代码、执行本机方法、切换回Java虚拟机的方法,或者不知何故,堆栈上的空间没有被释放——这就是我倾向于思考的。 希望这有帮助, 最好的问候, 汤姆。 |
|
|
5
0
很难说,但我认为问题的核心是在应用程序中需要维护两个堆——Java对象分配的标准Java堆(由JVM维护),以及通过调用MALOC/FULL维护的C堆。在没有看到一些代码的情况下,很难说到底发生了什么。 |
|
|
6
0
这里有一个反对它的建议。
使用标准malloc调用停止C代码,并使用另一个版本的malloc来获取内存
我强烈怀疑你会发现你的问题在你这样做之后就消失了。 |