Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.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_Memory_Size_Heap_Visualvm - Fatal编程技术网

未完全使用Java堆大小

未完全使用Java堆大小,java,memory,size,heap,visualvm,Java,Memory,Size,Heap,Visualvm,我目前正在使用Visual VM监控我正在运行的java应用程序: 我用-Xmx128m强调内存使用 运行时,我看到堆大小增加到128m(如预期的那样),但是在遇到java堆空间错误之前,使用的堆收敛到大约105m 为什么剩余的2000万内存没有被使用?Java将内存分为几代。如果终身生成已满,则可能会出现堆空间错误。通常,它们会动态调整大小,但如果设置了固定大小,则不会 堆被分成年轻一代(伊甸园空间,以及两个大小相同的幸存者空间,通常称为From和To)、老一代(终身)和永久空间 Xmx/X

我目前正在使用Visual VM监控我正在运行的java应用程序:

我用-Xmx128m强调内存使用

运行时,我看到堆大小增加到128m(如预期的那样),但是在遇到java堆空间错误之前,使用的堆收敛到大约105m


为什么剩余的2000万内存没有被使用?

Java将内存分为几代。如果终身生成已满,则可能会出现堆空间错误。通常,它们会动态调整大小,但如果设置了固定大小,则不会

堆被分成年轻一代(伊甸园空间,以及两个大小相同的幸存者空间,通常称为From和To)、老一代(终身)和永久空间


Xmx/Xms
选项设置总堆大小。因此,一个区域(默认大小)实际上是永久空间——也许,我们不知道您的压力测试的详细信息,实际上没有对象从eden移动到终身或永久空间,因此当eden耗尽空间时,这些区域仍然是空的。

您需要了解关于垃圾收集器人机工程学的一个中心事实:

垃圾收集成本高昂的部分是查找和处理非垃圾对象

这意味着:随着堆接近其最大容量,GC将花费越来越多的时间在回收的空间中获得越来越少的返回。如果GC尝试使用内存的最后一个字节,那么最终结果将是JVM将花费越来越多的时间进行垃圾收集,直到。。。最终。。。几乎没有做任何有用的工作

为了避免这种病态的情况,JVM监控用于GC和做有用工作的时间比率。当比率超过可配置的阈值时,GC会引发
OutOfMemoryError
。。。即使(技术上)有可用的可用内存。这可能就是你所看到的,尽管其他解释同样可信

您可以通过JVM选项更改GC阈值、生成大小等,但最好不要这样做。更好的办法是找出应用程序内存使用率不断攀升的原因。很可能是内存泄漏。。。i、 一只虫子。。。在导致此问题的代码中。花点精力查找和修复这些bug,而不是担心为什么没有使用所有内存


(事实上,您正在使用它……但不是一直都在使用。)

您能包括您得到的堆空间错误吗?也许这是permgen中的一个问题?你有多个堆,有“伊甸园空间”、“幸存者空间”和“终身Gen”。并且您拥有非堆内存。也许VisualVM中有一个过滤器。您的应用程序是否需要20m?我得到了一个“java.lang.OutOfMemoryError:java堆空间”错误。你所说的“视觉WM中的过滤器…”是什么意思?我目前正在读取大文件(总共大约100MB),并建立一个地图来保存某些信息,所以我想我需要一些内存。我不确定这里发生了什么。通常,当堆的大小为120MB时,您应该获得OutOfMemoryError。你能创建应用程序快照并发送给我吗?您是否有可复制的测试用例,可以共享?我想看一下。我没有收到超出GC开销限制的错误,而是收到java堆空间错误。感谢您的帮助,但据我所知,您描述的关于GC阈值的场景将抛出OutOfMemoryError:超出GC开销限制。但是,我得到的错误是OutOfMemoryError:java堆空间。因此,我认为问题不在于GC运行时间太长,没有回收足够的内存,而不是由于任何原因,堆空间不足。“任何原因”都很可能是内存泄漏,这是您应该重点跟踪和修复的。应用程序似乎没有使用所有的128Mb内存,这一点与此无关。即使这样,你还是会死于内存泄漏。。。稍晚一点。如果您有充分的理由担心由于GC开销而“浪费”23Mb内存,那么您可能选择了错误的实现语言!除了-Xmx128m之外,我没有设置任何其他选项。您需要监视哪些区域正在填充。我以为perm gen是单独存储的?@Will-me也是,但后来我读了一些文章解释说,
-Xmx
参数调整整个堆(包括PermGen)和其他标志,如
XX:MaxPermSize
tune内部堆结构,你能给我提供那篇文章的链接吗?谢谢。根据这篇文章,堆包含PermGen。因此,如果VisualVm认为PimMGEN不是使用空间(这不是直觉),我的问题就会得到解决。