【问题标题】:java blocks memoryjava阻塞内存
【发布时间】:2011-04-15 15:50:15
【问题描述】:

我有一个 java 程序,它使用弱 hashmap 来缓存一些东西,如果 java 需要更多内存,弱 hashmap 会被清除。这对我来说很好。现在我也在同一台计算机上运行了一个 c# 程序并识别了以下内容。

当 java 程序运行时,我的 c# 程序在计算机压力很大的时候运行不正确。另一方面,当 java 程序未运行时,我的 c# 程序也可以正常运行。

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

【问题讨论】:

  • 您是否通过为您的 java 程序分配任何特定的堆大小来运行您的代码?
  • 我猜你应该详细描述不正确的行为。
  • 听起来像是 C# 中的竞争条件。 (注意,弱引用会尽快清除。如果您正在实现缓存,请使用SoftReference 并忽略WeakHashMap。)
  • 你的 C# 程序是多线程的吗?那么原因可能是在高负载下发生的竞争条件。
  • 使用了jvm最大堆大小的参数,程序不是多线程的,可以排除死锁。

标签: c# java memory garbage-collection


【解决方案1】:

您无法像设置 JVM 堆一样为 .net CLR 堆设置最大界限。有关更多信息,请参阅this question。 CLR 将简单地尝试扩展其堆,直到它达到您的操作系统强加的进程内存限制,或者您的计算机的可用内存被用完。

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

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

【讨论】:

    【解决方案2】:

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

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

    您可以在 JVM 上使用命令行选项来控制 Java 的最大堆大小,从而限制它的饥饿程度。当然,如果您需要一大堆,那么一台机器可能无法容纳所有东西。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-04
    • 2015-11-01
    • 2020-11-12
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多