2011-09-03 42 views
2

我有一个应用程序执行一组非常连续的离散任务。内存管理的Java线程

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

我不得不执行的内螺纹的内存密集型任务的想法;新的子线程使用父JVM(这里并不令人意外),但内存管理看起来没有变化。

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

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

  1. 设置一个的Neo4j图形数据库(我创造几百万个节点,属性和关系,与众多指标一起)内存密集型]
  2. 图形数据库
+2

实际上你是否在任何时候内存不足?如果是这样,请增加VM的内存。如果没有,请不要试图了解VM如何处理内存。任何尝试这样做只会导致糟糕的代码,当虚拟机改变处理内存的方式时会破坏它。 – Bombe

+0

我确实耗尽内存;我本可以增加JVM的内存,但是我不想让剩下的代码有足够的内存空间。而且,概念证明的要点是尽可能少地运行这个概念。我发现有很好的方法可以直接为neo4j配置内存管理(请参阅下面的标记答案)。 我同意你关于不打扰与MEM管理和出于实用目的,GC欺骗概念,但它仍然是有趣的探索的可能性;) – JeffreyHammansson

回答

2

否,堆线程之间共享,并且没有办法保留存储器对于一个给定的线程或允许一个线程打破限制。线程不是进程(尽管它们在某些jvm中以这种方式实现)。

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

+0

谢谢,这正是我想知道的!任何正在寻找我如何解决问题的人最后都会检查Arnout的答案! – JeffreyHammansson

2

使用内存分析器找出哪个GC根保持对象活着,你预计将垃圾收集上进行查询。

我希望,然而,Neo4j的是保持这些对象还活着,可能有一点你可以做些什么。毕竟,你的图表及其索引确实需要在那里,以便你能够对它们执行查询。

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

+0

是,使用的Neo4j是这样的话;这是我的实际设置 'cache_type = none' 作为配置参数,告诉Neo4j的任何节点不存储在堆解决我的问题。它说这不是建议的,我可以理解为什么,但为了我的目的(测试)它非常有用。感谢您的正确方向。 为别人寻找: http://docs.neo4j.org/chunked/snapshot/configuration-caches。HTML http://wiki.neo4j.org/content/Configuration_Settings – JeffreyHammansson

+2

关于清洗高速缓冲存储器:参见[阅读JMX属性指令(http://docs.neo4j.org/chunked/snapshot/tutorials-java-embedded的-jmx.html) - 只需使用Cache.class,并且[clear()](http://components.neo4j.org/neo4j-management/snapshot/apidocs/org/neo4j/management/Cache.html )方法。注意:此功能只存在于Neo4j的AGPL许可的高级版和企业版中。 – nawroth