我有一个java程序,它使用弱hashmap来缓存一些东西,如果java需要更多内存,那么清除弱hashmap。这对我来说很好。现在我在运行的同一台计算机上也有一个c#程序,并认识到以下内容。
当java程序运行时,当计算机压力很大时,我的c#程序运行不正常。另一方面,当java程序没有运行时,我的c#程序也运行正常。
可能是我的java程序阻止了我的c#程序可以使用的内存吗?我怎么能找到这个?
答案 0 :(得分:2)
您的Java程序会将其堆扩展到给定大小。垃圾收集将释放将对象返回到堆的可用空间的对象,但不会减少Java程序使用的整体记忆。
使用您的操作系统功能来调查C ++和Java应用程序消耗的内存。
您可以在JVM上使用命令行选项来控制Java的最大堆大小,从而限制它的饥饿程度。当然如果你需要一个巨大的堆,那么一切都可能不适合一台机器。
答案 1 :(得分:2)
您不能以与JVM堆相同的方式设置.net CLR堆的最大边界。有关详细信息,请参阅this question。 CLR只会尝试扩展其堆,直到达到操作系统强加的进程内存限制,或者机器的可用内存用完为止。
所以,是的,当你增加你的JVM堆大小时,你可以保留你的CLR原本会使用的内存。 JVM将从下限开始并在需要时扩展到上限。如上所述,该内存不会在JVM外部释放 - 它不可用于.net CLR。
你需要做更多的监控,看看内存是否真的是导致问题的原因。