【问题标题】:Limit memory usage of a java class限制java类的内存使用
【发布时间】:2011-09-07 18:11:24
【问题描述】:

我正在编写一个使用 java MOA 框架运行的 java 类。 该类具有对点流进行聚类的功能。此类由 MOA 应用程序调用。我想限制这个类的总内存(至少堆上使用的内存,可以排除堆栈内存)使用(不包括MOA应用程序使用的内存)。

有可能吗?我希望很清楚该类正在被 MOA 应用程序实例化和调用。我首先运行 MOA 应用程序,然后选择从 GUI 运行 myclass 来执行集群。由于这个原因,像 -Xmx 这样的 JVM 选项对我不起作用。

【问题讨论】:

    标签: java memory jvm cluster-analysis moa


    【解决方案1】:

    您可以在类中嵌入逻辑以定期检查 Runtime.freeMemory() 和 Runtime.maxMemory() 并在限制似乎接近时采取措施(刷新缓存等)。有点“不确定”,因为不同的平台报告堆统计数据不同。

    您还可以为某些“可选”存储使用 SoftReference 方案。然后如果需要堆,GC 将删除对象。 (虽然这个方案是用大锤拍蚊子。)

    当然,您可以简单地计算您的对象分配。

    【讨论】:

    • 你可能没有足够的 freeMemory() 因为你需要运行一个 GC。它看起来有点接近,但距离内存不足还有很长的路要走。
    • 是的,Java 有问题。根据 GC 算法和统计数据的报告方式,您可能似乎内存不足,并且只需要运行 GC 并且您有大量可用内存。我认为 JVM 应该在报告 freeMemory() 值之前运行 GC,但是您不知道这是主要 GC 还是次要 GC,JVM 甚至可能绕过该 GC(就像许多人忽略“runGC”一样)调用)出于“效率”的原因。
    • 谢谢!!计算对象分配是最后的手段。我会尝试你的其他建议,看看它们是否对我有用。f
    【解决方案2】:

    您只能限制 JVM 的全局内存使用量。

    要限制类的使用,你需要启动另一个 JVM 并在新的 JVM 中使用该类。

    但是,通常最好修复您的代码,这样该类就不会使用太多内存。 ;)

    【讨论】:

    • 这与修复代码无关。内存使用量会随着到目前为止聚集的点数的增加而增加,并且还会根据一些参数的选择而变化。我想限制总内存使用量,以便程序在即将超过内存限制时告诉我。
    • 您可以计算创建的点/对象的数量,前提是您知道它们的大小并确保不超过某个数字。
    猜你喜欢
    • 2017-11-20
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 2010-11-15
    • 2011-06-24
    • 2012-09-28
    • 2017-05-12
    • 2014-12-16
    相关资源
    最近更新 更多