我一直认为垃圾收集器只清除堆,现在我这么认为。在java8中,permGen被删除并被Metaspace取代。据我所知,Metaspace是垃圾收集器(https://stackoverflow.com/a/24075360/2674303)谁从Metaspace收集垃圾? 最佳答案 我认为您的困惑源于口语化的术语“垃圾收集”,该术语被广泛使用但并未真正描述托管环境中发生的情况。内存管理是一个复杂的过程,它被简化为:识别哪些对象是垃圾,其实就是判断哪些对象可达(读作:不是垃圾),没有遇到的都认为是垃圾如有必要,将对象引用排队到引用队
我知道他们在Java8中用MetaSpace替换了PermGen。但我有几个问题:MetaSpace是否默认进行GC收集?即使是PermGen也是通过添加像-XX:+CMSClassUnloadingEnabled这样的参数来进行GC收集的,那么是什么让MetaSpace比PermGen更好呢?MetaSpace基于native内存,因此它将java对象保存在磁盘上而不是VM上?即使是MetaSpace也会耗尽内存?如果再次出现,我将得到OutOfMemoryException。默认情况下,MetaSpace可以随着内存的增加而增长吗? 最佳答案
问题描述我注意到,我们的Java8应用程序之一在Wildfly8.2.1上的每次部署都会使用元空间内存池中的大约30-40MB。这很好,但问题是,一旦我重新部署同一个应用程序,Metaspace内存使用量就会增加同样的30-40MB,而旧的已经分配的内存不会被释放。我什至不会注意到它,但问题是我们有大约20个应用程序,有时我需要同时重新部署多达10个应用程序。这反过来会导致一幅可怕的画面。基本上显示的是大约10个应用程序的2次重新部署。我不确定为什么GC不能释放分配给旧类的内存。该服务器总共有16GB物理内存,因此我可以重新部署所有应用程序多达20-40次,仅此而已。应用服务器将达到限
我正在运行的一个Java进程在它运行的头一个小时左右一直表现良好。但是,性能会迅速下降。在分析时,我发现元空间垃圾收集发生得相当频繁,直到小时标记,然后就失去了控制:我很确定我可以使用-XX:MaxMetaspaceSize选项来解决这个问题。但是,我想更多地了解为什么会发生这种行为。我无法想象为什么垃圾收集算法会这样。有没有人对更好的解决方案有解释或建议?谢谢 最佳答案 您可以尝试设置-XX:MaxMetaspaceExpansion=0。这应该在尝试增加元空间之前强制执行完整的GC-释放动态创建的方法/类数据。此外,您可以尝试将
问题早上过来发现定时任务出现告警,FlinkJobs运行失败,登录Flinkweb后台一看,所有jobs都没了,slot也为0。查看Flink日志,有以下错误异常:2022-12-0708:00:05,444ERRORorg.apache.flink.runtime.taskexecutor.TaskManagerRunner[]-FatalerroroccurredwhileexecutingtheTaskManager.Shuttingitdown...java.lang.OutOfMemoryError:Metaspace.Themetaspaceout-of-memoryerrorha
将我们的Java应用程序(在Tomcat上运行的服务)JRE从Java7切换到Java8后,我们开始看到java.lang.OutOfMemoryError:Metaspace经过几天的高流量运行。堆使用正常。在性能测试期间执行相同的代码流一段时间后,元空间会跳转。元空间内存问题的可能原因是什么?当前设置为:-server-Xms8g-Xmx8g-XX:MaxMetaspaceSize=3200m-XX:+UseParNewGC-XX:+UseConcMarkSweepGC-XX:MaxGCPauseMillis=1000-XX:+DisableExplicitGC-XX:+Print
我知道他们在Java8中已将PermGen替换为MetaSpace。但我有几个问题:MetaSpace是否默认被GC收集?连PermGen都是GC收集的,加了-XX:+CMSClassUnloadingEnabled之类的args,那MetaSpace有什么比PermGen更好的地方呢?MetaSpace是基于本地内存的,所以它会将java对象保存在磁盘上而不是VM上?即使MetaSpace也会耗尽内存?如果再次这样,我会得到OutOfMemoryException。默认情况下,MetaSpace可以随着内存的增加而增长? 最佳答案
在Java7之前,JVM内存中有一个名为PermGen的区域,JVM用来保存它的类。在Java8它被移除并被称为Metaspace的区域所取代。PermGen和Metaspace之间最重要的区别是什么?我知道的唯一区别是java.lang.OutOfMemoryError:PermGenspace不能再抛出,VM参数MaxPermSize被忽略。 最佳答案 从用户的角度来看,主要区别(我认为之前的答案并不够强调)是Metaspace默认自动增加它的大小(达到底层操作系统提供的大小),而PermGen总是有一个固定的最大尺寸。您可以使
在Java7之前,JVM内存中有一个名为PermGen的区域,JVM用来保存它的类。在Java8它被移除并被称为Metaspace的区域所取代。PermGen和Metaspace之间最重要的区别是什么?我知道的唯一区别是java.lang.OutOfMemoryError:PermGenspace不能再抛出,VM参数MaxPermSize被忽略。 最佳答案 从用户的角度来看,主要区别(我认为之前的答案并不够强调)是Metaspace默认自动增加它的大小(达到底层操作系统提供的大小),而PermGen总是有一个固定的最大尺寸。您可以使