问题标签 [metaspace]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
406 浏览

java - Metaspace out of memory even 20-30% or more space free

A Keycloak/JBoss server running using Java 8 was switched to G1GC and a -XX:MaxMetaspaceSize was set to 256MB. It soon stopped responding with logs filling up with OutOfMemory: Metaspace errors. GC logs were not enabled. Server was hooked with Dynatrace monitoring service which showed plenty of metapsace available.

191MB used out of 256MB allocated on one occasion. 165MB used out of 256MB allocated on a second occurrence.

I understand that to free metaspace, GC was invoked and being unable to free enough space it was running GC after GC so it makes sense why the process was stuck. However, what I am unable to understand is why process was running out of metaspace even when plenty was free. No other JVM parameter was provided (except XMS/XMX). All heap memory sections had plenty of free space. Was something trying to allocate 60MB+ space in metaspace? Is this the only possible reason?

0 投票
0 回答
128 浏览

java - Java VM 的元空间运行满

我试图让我的 Java 代码运行,但每当我尝试元空间开始变满。起初我什至没有注意到它,因为它需要很长时间(约 1 个月)才能完全运行并崩溃。

我做的第一件事是查看代码,是否有正在创建的对象并填充了大量数据并且没有被 GC 删除。在确定这(很可能)不是这种情况后,我编写了一个导致相同错误的小测试程序。

在我的 main 中,我调用了一个新的 TimerTask 并为其分配了一个 Timer。之后我只是安排它。

这里的 TimerTask 本身只是创建了一堆应该在之后删除的对象。

所以我尝试调试它。为此,我使用了VisualVM的 2.0.4 版本。让它运行一段时间后,我得到了MetaspaceHeap的这两张图片。

此外,这是我的 JVM 参数,

我的 JVM 版本OpenJDK 64 位服务器 VM(11.0.8+10,混合模式)和我的 Java版本 11.0.8,供应商 Oracle Corporation

我能做些什么来解决这个问题并阻止我的元空间填满吗?

0 投票
1 回答
520 浏览

java - 元空间增长、死类加载器和 GC

我们有一种情况,springboot 微服务的元空间不断增长,但堆表现良好。

jmap -clstats 显示有成千上万的以下类型的死类加载器。

0x00000000e3c8e3c8 1 4087 0x00000000e0004d18 死 com/sun/org/apache/xalan/internal/xsltc/trax/TemplatesImpl$TransletClassLoader@0x000000010087c7e8

在最初的高水位 GC 被触发,我看到元空间下降。在由于定义的元空间大小而触发的强制 GC 之后,我看到元空间不断增长,并且我看到更多相同类型的死类加载器被保留在元空间中。我确实看到了一些 GC 活动,但元空间消耗没有下降。但是,如果我通过 visualvm 强制 GC 收集,则会卸载大量类,并且元空间消耗将回到服务启动时的状态。

为什么 JVM 管理的 GC 不会卸载这些死掉的类加载器,而强制 GC 会呢?如果弱/软/幻像引用是原因,那么它不应该也适用于强制 GC 吗?

这是在Java8上。任何人都可以就我接下来应该看的地方给出一些指示吗?显然存在泄漏,那么有没有办法知道 TemplatesImpl$TransletClassLoader 的父类加载器?

感谢任何帮助。

0 投票
0 回答
108 浏览

java - 无法在 Linux 服务器上运行 Java

如果我在 Linux 服务器上执行 JAVA 命令,就会发生这种情况。只要我通过 /specifying/the/path 直接执行它,问题就一定不是关于 PATH

那么,我该怎么办?谢谢

0 投票
0 回答
253 浏览

java - 非堆空间中的 Java 内存泄漏

我有一个存在内存问题的 Java 应用程序(在 OpenJDK 1.8.0_181 下运行)。特别是在一段时间后,所有物理内存似乎都被消耗了,并且应用程序无法分配更多内存。困难的部分是导致问题的不是堆内存。我正在努力了解如何进一步调查它,因为它不是堆内存。

以下是我遇到的内存崩溃类型:

或者

在所有这些情况下,服务器的物理内存都被完全消耗掉了。然后应用程序无法分配内存或扩展堆,因此它崩溃了。

首先是top命令的结果:

Java 应用程序使用以下内存设置运行:java -Xms512m -Xmx3072m

所以应用程序最多可以使用 3GB 的堆空间。但是您可以看到 java 进程(RES 内存)已经使用了超过 6GB 的 RAM。

在这一点上,很明显我需要查看非堆空间。有所谓的元空间,我认为它面临内存泄漏。我做了以下检查:

在这里我看到使用的内存是 647154K + 1048981K 的堆和 2235431K 的元空间(非堆)。总量为 3931566K = 3840M = 3.75 GB。但是 Java 进程消耗的剩余内存是多少呢?很多:6.18 - 3.75 = 2.43 GB 的 RAM。

我还使用 jstat 检查了更多统计信息:

在这里,我使用以下公式计算整个 Java 内存:

它比 Java 进程消耗的 3.75 GB 略多,GC.heap_info但仍远低于 Java 进程消耗的 6.18 GB。

所以我有点迷茫,我需要一个建议:

  • 如何确定哪种类型的 Java 内存占用 2.43 GB?
  • 如何限制该内存或确保及时清除它以避免 OutOfMemory 崩溃?
  • 我是否应该设置额外的参数,例如 -XX:MaxMetaspaceSize -XX:MaxMetaspaceFreeRatio?如果是这样,这些的合理值是多少?
0 投票
0 回答
53 浏览

java - 许多部署的元空间问题(wildfly 9)

我们目前有一个问题,即容器中已部署的 ear 文件数量超出了元空间限制。不幸的是,使用的服务器在土豆上运行,无法升级。机架已满,并且在没有更多占地面积的工厂内。因此,我们不能再简单地“增加元空间”,这是过去 5 年的解决方案。

问题类似于 共享公共库会解决我的“java.lang.OutOfMemoryError: Metaspace”吗?但这从未得到核心问题的答案:包含共享库的模块实际上可以减少所需的元空间吗?这是假设耳朵本身不再需要在其耳朵类加载器中加载公共库。

目前我已经做了一个 maven 项目,它实际上会收集所有这些库,这样我就可以将它们添加到 ./wildfly/modules/ 目录中,并确保更新 jboss-deployment-structure 以依赖于这个模块。我的期望是确实使用的元空间应该减少,但是用 jstat 验证这一点似乎表明没有改进。在两次测试之间,我确保删除 wildfly 数据目录。

我的期望错了吗?还是我错过了什么?

0 投票
1 回答
203 浏览

java - GeneratedMethodAccessor from JVM_DefineClass loaded 10k times cause oom

enter image description here

added "-verbose:class" in jvm paramerter, and got 10k times log like below, "Loaded sun.reflect.GeneratedMethodAccessor10004 from JVM_DefineClass"

do I have any way to find the origin class and what is the root method of my application caused this?

I know "GeneratedMethodAccessor### are classes generated at runtime by the reflection implementation to call methods and constructors", but I don't what is the specific method or class loaded?

0 投票
0 回答
23 浏览

jvm - 我有办法查看元空间中的确切类吗

我在肉类空间中遇到了 oom 的问题,我有办法获取加载的确切类吗?我使用 -verbose:class 打印日志,但它显示“[Loaded sun.reflect.GeneratedMethodAccessor9668 from JVM_DefineClass ”,我真的不知道原始类是什么。我尝试使用“jmap -clstats pid”,但这会在亲环境中停止世界很长时间,并且我只能获取类加载器大小,并且无法知道加载的确切类。我尝试使用“async-profiler”来解决问题,但它对我不起作用(可能是因为我错误地使用它。)所以有没有工具或命令可以知道元空间中加载的类?

0 投票
1 回答
32 浏览

jvm - 在 jdk 1.8+ 中,如何元空间布局类信息?

在jdk1.8+中,当MetaspaceTest类加载到jvm中时,这是我对内存布局的理解,对吗?

0 投票
0 回答
38 浏览

scala - SBT 1.3.1 中的 OutOfMemoryError 元空间

我有一个在 scala 2.11.12 和 SBT 1.2.1 上运行的 SBT 项目。我最近将 SBT 版本升级到 1.3.1。突然我开始收到OOM错误。

我使用 SBT 1.2.1 的 SBT OPTS 是这样的。

现在当我将 XX:MaxMetaspaceSize 更改为 3072M 时,我突然看到 OOM 消失了。

为较新的 SBT 版本使用更多元空间是否是一种合理的解决方法?