Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于内存管理的Java线程_Java_Multithreading_Memory_Neo4j - Fatal编程技术网

用于内存管理的Java线程

用于内存管理的Java线程,java,multithreading,memory,neo4j,Java,Multithreading,Memory,Neo4j,我有一个应用程序,它执行一组非常连续的离散任务 我的问题是,第一个任务之一消耗了大量内存,尽管消除了对象引用并调用了垃圾收集器,但实际上只有大约一半的内存被释放。这会影响以后的任务。问题还在于,我想暂时给JVM一个大堆,以便有效地管理第一个任务,但我不希望在GC决定释放其余任务是有效的之前一直这样 我有在线程内执行内存密集型任务的想法;新的子线程使用父JVM(这并不奇怪),但内存管理似乎没有变化 Java如何处理线程内存?有没有一种简单的方法可以为子线程创建一个子堆,该子线程可以在线程完成后转储

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

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

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

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

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

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

  • 使用内存探查器找出哪个GC根使您期望被垃圾收集的对象保持活动状态

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


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

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


    您可以在一个单独的进程(不同的JVM)中运行该线程,并通过文件或套接字向其传递数据,但尽管它可以解决内存问题,但它可能会破坏性能。。。但这取决于您需要传递的数据量。

    您是否真的在任何时候耗尽了内存?如果是,请增加VM的内存。如果没有,就不要费心去理解VM是如何处理内存的。任何这样做的尝试都只会导致可怕的代码,当虚拟机改变它处理内存的方式时,代码就会中断;我本来可以增加JVM内存,但我不希望有这么多内存可供其余代码使用。此外,概念验证的要点是尽可能少地运行它。我发现有很多很好的方法可以直接为neo4j配置内存管理(参见下面的标记答案)。我同意你的观点,即为了实际目的不必费心与mem管理和GC作对,但探索可能性仍然很有趣;)是的,Neo4j就是这样;这就是我通过将
    cache\u type=none
    设置为配置参数,告诉neo4j不要在堆中存储任何节点来解决问题的方法。它说它不被推荐,我可以理解为什么,但对于我的目的(测试)它是非常有用的。谢谢你朝着正确的方向轻推。对于正在查看的其他人:关于清理缓存:请参阅-just use Cache.class,其中有一个方法。注意:此功能仅存在于Neo4j的AGPL许可高级版和企业版中。谢谢,这正是我想知道的!任何想知道我是如何解决这个问题的人,最后都可以看看阿诺特的答案!