2010-09-22 47 views
2

我有一个Java程序,使用弱散列图缓存一些事情,如果Java需要更多的内存弱散列图被清除。这对我来说很好。现在我在同一台计算机上也有一个C#程序,运行并识别出以下内容。java块内存

当java程序正在运行时,我的c#程序在计算机负荷过重时无法正常运行。另一方面,当java程序没有运行时,我的c#程序在这些时候也运行良好。

难道我的java程序会阻塞我的c#程序可以使用的内存吗?我怎样才能找到这个?

+0

您是否正在通过为您的java程序分配任何特定的堆大小来运行代码? – 2010-09-22 10:26:06

+1

我想你应该在细节中描述不正确的行为。 – foret 2010-09-22 10:26:54

+0

听起来像在你的C#中的竞争条件。 (注意,弱引用会尽快被清除,如果你正在实现一个缓存,使用'SoftReference'并忽略'WeakHashMap'。) – 2010-09-22 10:27:42

回答

2

您的Java程序会将它的堆扩展到给定的大小。垃圾收集将释放对象将它们返回到堆的可用空间,但不会减少Java程序使用的总体内存。

使用您的操作系统功能来调查C++和Java应用程序使用的内存。

您可以使用JVM上的命令行选项来控制Java的最大堆大小,从而限制它的饥饿程度。当然如果你需要一个巨大的堆,那么有可能一切都不适合在一台机器上。

+0

这些参数已打开,是否有可能在.net/c#环境中使用这些参数? – 2010-09-22 11:07:17

+0

它不仅仅是开启了,而且它们设置的重要性 - 做数学,衡量c#需要什么,为Java添加最大值 - 它适合吗?当你的c#出现问题时,你会发现内存不足吗?我是一个爪哇小伙,害怕我不知道如何控制c#。 – djna 2010-09-22 11:50:25

+0

阅读此链接http://www.caucho.com/resin-3.0/performance/jvm-tuning.xtp和此链接 http://publib.boulder.ibm.com/infocenter/wmbhelp/v6r1m0/index.jsp ?主题=/com.ibm.etools.mft.doc/ac55070_.htm – Reddy 2010-09-22 16:49:13

2

你不能为你的.net CLR的堆设置一个最大边界,就像你为JVM的堆一样。有关更多信息,请参见this question。 CLR只会尝试扩展其堆,直到达到您的操作系统强制的进程内存限制,或者您的计算机的可用内存已用完。

所以是的,当你增加你的JVM堆大小时,你可以保留你的CLR会使用的内存。如果需要,JVM将从下限开始并扩展到上限。如上所述,该内存不会在JVM外部释放 - 它不会被提供给.net CLR。

你需要做一些更多的监测,看看内存是否真的是问题的原因。