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
java程序崩溃,即使使用大的-Xmx30g_Java_Memory - Fatal编程技术网

java程序崩溃,即使使用大的-Xmx30g

java程序崩溃,即使使用大的-Xmx30g,java,memory,Java,Memory,我有一个从3GB文件读取的大哈希映射。我用 java-Xmx30g(机器有50+GB的RAM),但是在向映射添加元素时,它仍然会在某个时间点被杀死, 原因是什么?如何对此进行故障排除 Map map=new HashMap(); Map Map=newhashmap(); 我无法确定您正在从存储到HashMap的文件中读取的数据,因此我的回答无法具体和具体 但是考虑一下这些事情: java字符串中的字符是unicode,使用2个字节。因此,如果您的文件包含字符串,它们在内存中的大小可以是原来的两

我有一个从3GB文件读取的大哈希映射。我用 java-Xmx30g(机器有50+GB的RAM),但是在向映射添加元素时,它仍然会在某个时间点被杀死, 原因是什么?如何对此进行故障排除

Map map=new HashMap(); Map Map=newhashmap();
我无法确定您正在从存储到HashMap的文件中读取的数据,因此我的回答无法具体和具体

但是考虑一下这些事情:

  • java字符串中的字符是unicode,使用2个字节。因此,如果您的文件包含字符串,它们在内存中的大小可以是原来的两倍(约6GB)
  • HashMap结构有自己的内存占用
  • Java在更多的空间中分割堆内存:youg-gen、old-gen、perm-gen(),因此您可能无法使用预期使用的所有30g
  • 我的第一个建议是添加一个日志信息,计算您可以使用
    -Xmx10g
    插入多少行文件,然后是
    -Xmx20g
    ,然后是
    -Xmx30g
    。如果这个数字没有特别的问题,但正常的内存使用


    另一个注意事项:当堆空间太大时,JVM和垃圾收集的性能可能会很差。因此,以这种方式增长堆不是最佳做法。尝试另一种解决方案,如嵌入式数据库(Java有自己的:,但您可以找到替代方案)。

    32位机器还是64位机器?也许其他一些数据结构也在消耗内存你的问题在我脑海中提出了一个问题。。。为什么你需要在内存中保存3GB的数据(我想是在你的应用程序之外)?我假设3GB的数据在任何给定的时间点都不会显示在屏幕上,因此内存中的大量数据是不必要的(即使对于响应用户查询的设计也是如此)。和如果你需要借出那台50+GB的机器,我会借它。。。我的内存只有区区12GB,哈哈。检查一下javacore转储文件,看看你把内存空间花在了什么上面。考虑一下你是否真的打算把所有的记忆都保存在记忆中。如果是的话,想一想是否有更好的方式来表达它。。。或者,如果你应该重新组织问题,把它分成小块处理。如果没有,请找出仍然引用它的内容,并防止它被垃圾收集。如果您使用Linux,请阅读以下内容:如果VM不喜欢内存参数,它将在启动时告诉您。您是否在控制台中验证了它接受了它?