【问题标题】:Java Threads for Memory Management用于内存管理的 Java 线程
【发布时间】:2011-09-03 17:17:33
【问题描述】:

我有一个应用程序执行一组非常连续的离散任务。

我的问题是第一个任务消耗大量内存,尽管消除了对象引用并调用了垃圾收集器,但实际上只有大约一半的内存被释放。这会影响以后的任务。问题还在于我想暂时授予 JVM 一个大堆来有效地管理第一个任务,但我不希望它一直存在,直到 GC 决定释放其余部分是有效的。

我有在线程内执行内存密集型任务的想法;新的子线程使用父 JVM(这并不奇怪),但内存管理似乎没有变化。

Java 如何处理线程内存?有没有一种简单的方法可以为子线程创建一个子堆,可以在线程完成后转储?

作为附录,这是我真正想做的:

  1. 设置 Neo4j 图形数据库(我正在创建数百万个节点、属性和关系以及大量索引)[内存密集型]
  2. 对图形数据库执行查询

【问题讨论】:

  • 您是否真的在任何时候都耗尽了内存?如果是这样,请增加 VM 的内存。如果没有,不要费心去理解 VM 是如何处理内存的。任何这样做的尝试都只会导致可怕的代码在 VM 更改其处理内存的方式时中断。
  • 我确实内存不足;我本可以增加 JVM 内存,但我不希望有那么多内存可供其余代码使用。此外,概念证明的重点是尽可能少地运行它。我发现有很多很好的方法可以直接为 neo4j 配置内存管理(请参阅下面的标记答案)。我同意你的想法,即出于实际目的不用费心去欺骗内存管理和 GC,但探索可能性仍然很有趣;)

标签: java multithreading memory neo4j


【解决方案1】:

不,堆在线程之间共享,没有办法为给定线程保留内存或允许线程突破限制。线程不是进程(尽管它们在某些 jvm 中以这种方式实现)。

您可以在单独的 procss(不同的 JVM)中运行此线程并通过文件或套接字将数据传递给它,但是虽然它可以解决内存问题,但它可能会影响性能......但取决于您需要多少数据通过。

【讨论】:

  • 谢谢,这正是我想知道的!任何寻找我如何解决问题的人最后都会检查 Arnout 的答案!
【解决方案2】:

使用内存分析器找出哪个 GC 根使您希望被垃圾回收的对象保持活动状态。

不过,我希望 Neo4j 可以让这些对象保持活力,您可能对此无能为力。毕竟,您的图表及其索引确实需要在那里,您才能对它们执行查询。

您也许可以找到一些 Neo4j API 调用来告诉它清除一些缓存或类似的东西。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 2015-03-19
  • 2018-06-19
  • 1970-01-01
  • 2012-08-08
  • 1970-01-01
相关资源
最近更新 更多