在java中我们可以通过多少方式解决堆空间问题?

时间:2015-01-02 13:10:07

标签: java performance jvm heap-memory

我知道我们可以通过最大化这些JVM变量-Xms,-Xmx来增加堆大小。

但我有疑问:

  1. 处理堆空间的其他方法是什么?
  2. 堆内存是否依赖于系统辅助内存?

3 个答案:

答案 0 :(得分:0)

在尝试使用java设置堆大小时,需要注意几点,快速搜索后我发现以下网站对JVM如何处理堆有一些要点: http://javarevisited.blogspot.co.uk/2011/05/java-heap-space-memory-size-jvm.html

*显然Oracle java站点应该是您的第一个调用点。

1)我不认为你可以在运行时动态调整堆空间。所以把它设定为开始是必须的。

2)取决于您是否运行32/64位操作系统,以及PC上有多少RAM

3)请参阅上面的链接和Oracle自己的文档,它太大了,无法描述:)

4)真正取决于您的编程和PC上的资源。良好的编程实践应该可以阻止任何重大问题,但是如果你找到太多完整的GC,你可能希望看看你是否有“内存泄漏”问题。在堆的Perm部分的某处

答案 1 :(得分:0)

关于你的第一个问题:使用java.nio.ByteBuffer.allocateDirect()你可以在堆之外分配内存,即在运行时扩展内存占用量。

来自Javadocs:

直接缓冲区的内容可能位于正常的垃圾收集堆之外,因此它们对应用程序内存占用的影响可能并不明显。因此,建议直接缓冲区主要分配给受基础系统本机I / O操作影响的大型长期缓冲区。通常,最好只在它们在程序性能上产生可测量的增益时才分配直接缓冲区。

答案 2 :(得分:0)

  

处理堆空间的其他方法是什么?

大约有500个用于控制堆的选项,其中最常见的是Hotspot VM Options

  

堆内存是否依赖于系统辅助内存?

当涉及堆大小时,只有主要内存需要担心。 64位JVM的默认堆大小是主内存的1/4。