问题标签 [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.
java - 在 Wildfly 8.2.1 上部署的 Java 8 应用程序的元空间内存消耗问题
问题描述
我注意到,我们在 Wildfly 8.2.1 上的 Java8 应用程序的每个部署都使用来自 Metaspace 内存池的大约 30-40 MB。这很好,但问题是,一旦我重新部署同一个应用程序,元空间内存使用量将增加相同的 30-40 MB,而旧的已分配内存不会被释放。
我什至不会注意到它,但问题是我们有大约 20 个应用程序,有时我需要同时重新部署多达 10 个应用程序。这反过来又导致了一幅可怕的画面。
我不确定为什么 GC 不能释放分配给旧类的内存。该服务器总共有 16GB 物理内存,因此我最多可以重新部署所有应用程序 20-40 次,仅此而已。应用服务器将达到限制并停止响应任何命令。
因此,如果有人可以帮助我了解实际问题可能是什么,我将非常感激:
- 这是Java8的问题吗?(jdk 1.8.0_40-b26)
- 这是 Wildfly 8.2.1 的问题吗?
- 或者答案是否尽可能简单,原因是我的代码库?如果是这样,那么请您指导我可能是什么实际原因?
与我的代码库相关的更多细节
1) 与 Wildfly 一起,我使用 2 个独立的 HornetQ 服务器,每个应用程序使用约 5 个通道,每个通道至少有 5 个并发消费者。这反过来导致每个应用程序至少有 25 个线程,总共至少 25*20 = 500 个线程。
2) 对于所有低级 JMS 操作,我使用 Spring JMS。
java - 元空间和垃圾收集
我在元空间填充时遇到了一些问题,我试图弄清楚 GC 是如何处理它的。我在这里读到次要 GC 增加了元空间的使用。我也一直在阅读有关它的文献,但我无法得出正确的结论。
有人对 GC(次要和主要)如何影响元空间有很好的解释吗?
java - OutOfMemoryError:压缩的类空间
我收到了这个错误:
直到我弄清楚触发器是什么,我试图禁用压缩类指针
-XX:-UseCompressedClassPointers.
但我仍然收到此错误。这怎么可能?
谢谢!
hibernate - 为什么 Java 8 中的类元空间会随着时间增加?
我正在运行 Tomcat 应用程序(由 Hibernate + EhCache 组成)。它是典型的 ORM webapp,不应该创建很多类。但是,本机内存跟踪说“不”。
在过去的 24 小时内,我的 webapp 在 Metaspace 中平均每小时创建约 1 个新课程,最高每小时 11 个课程,最高 4 小时没有创建课程。
所以,我从 7449 课开始,24 小时后我有 7481 课。诱导 full GC 后,类的数量可以减少 0-2,但总体保持不变。
所以
如果类是延迟加载的,我如何估计要在本机内存中创建的类的总数?
- 我知道 Hibernate 创建代理类。有没有办法预测这些代理类计数?
- 如何强制 JVM 急切地加载所有类?
如何记录哪些新类加载到元空间?
我的配置:
java - java8“java.lang.OutOfMemoryError:元空间”
java.lang.OutOfMemoryError: Metaspace
在将我们的 Java 应用程序(在 Tomcat 上运行的服务)JRE 从 Java 7 切换到 Java 8 后,我们在运行几天后开始看到高流量。
堆使用情况正常。在性能测试期间执行相同的代码流时,元空间会跳转。
元空间内存问题的可能原因是什么?
当前设置为:
此外,该应用程序大量使用反射。我们还使用自定义类加载器。他们都在java 7中工作正常。
java - Java 8 VM.native_memory
我在使用 java 8 元空间内存管理时遇到了困难。我目前在 RHEL 上使用 jdk 1.8_60。
这是我的 tomcat 类路径:
当我执行时,jcmd <PID> VM.native_memory summary.diff
它显示为 Class 保留的内存(我认为是元空间大小)超过 256m(看起来像默认值 1g)。
我正在使用 cxf动态客户端进行动态 WS 调用,因此每个调用都会生成大量类,但看起来这些类永远不会从元空间中删除(即使我单击按钮在 jvisualvm 中执行 gc)。最后元空间已满,应用程序以OutOfMemoryException: Metaspace结束
我也在这个配置中使用了 GC1,-XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+ParallelRefProcEnabled -XX:+AggressiveOpts
但这对我没有帮助。
那么jvm中是否可能存在错误,显示元空间的内存分配错误(或者更糟糕的是它使用这个值来管理元空间)?有人可以指出一些如何解决元空间清理问题的方向吗?
非常感谢
java - 将 java 版本从 1.7 升级到 1.8 后 CPU 利用率下降
对于我的应用程序,我们最近从 1.7 升级到 java 1.8,根据性能测试结果,我们检查了 CPU 利用率是一个大问题,它增加了71%!
我在 jdk8 中使用下面的 jvm 参数:
除了所有这些,我很困惑的最重要的事情是我们现在应该选择的 MaxMetaSpaceSize 是什么。
对于 Jdk1.7,我使用的是:
在 jdk1.8 中保持一切不变,只将 MaxPermSize 更改为 MaxMetaSpaceSize :
请让我知道如何提高我的应用程序的性能。有什么我遗漏的 - 因为 jdk8 正在使用本机内存区域,因此
- 增加服务器上的空间是否有帮助。
- 我保持 MaxMetaspaceSize 的值与之前的值相同——我如何在这个新架构上决定这个值。
java - 为类卸载(元空间清理)/ cxf 问题更正 java 8 设置
我正在我的应用程序中创建动态 CXF 客户端。
这是客户端创建的代码片段:
现在,当我使用此参数设置测试应用程序时
并在循环中执行客户端创建,我得到 java.lang.OutOfMemoryError: Metaspace 异常。我不知道为什么不卸载类/清理元空间。如果有人可以帮助我,这是我的测试项目。只需构建(mvn clean package)它并像我一样使用命令行执行。
我正在使用JDK8u77。
java - 设置 MetaspaceSize 的指南 - java 8
64 位服务器的 MetaspaceSize 的默认值是多少?我在官方文档中找不到。
我观察到,在服务器 JVM 进程中,有时 GC 频率会变高并不断增长。如果我重新启动服务几次,它会恢复稳定。我认为这是由于 JRE 升级。
JVM 堆最大大小设置为 6GB,但是当出现此问题时,我们看到仅使用了 3GB 堆。元空间增长很小,几乎总是满的。我尝试将元空间增加到 1GB,它提高了吞吐量。
我认为发生的情况是 Metaspace 默认设置为非常低的值,因此 GC 启动。每次 GC 发生时,高水位标记都会不断增加(再次增加非常低的量)。
我想设置 MetaspaceSize (不确定当前值是多少)。
Oracle 文档说没有指南可以知道将 MetaspaceSize 设置为什么。但是有没有办法找出设置它的正确值是多少?
我从 Oracle 文档中得到的一个提示是:
If the committed space available for class metadata as a percentage of the total committed space for class metadata is greater than MaxMetaspaceFreeRatio, then the high-water mark will be lowered. If it is less than MinMetaspaceFreeRatio, then the high-water mark will be raised.
但仍然无法弄清楚如何稳定 GCs..我有三个问题:
- 64 位服务器上的默认 MetaspaceSize 是多少?
- 默认比率是多少:MaxMetaspaceFreeRatio、MinMetaspaceFreeRatio 设置为?答:显示Min是40,Max是70
- 如何决定 Metaspacesize 值?
jvm - 如何获取 Java8 元空间转储(不是堆转储)
是否有任何工具能够从 Java8 热点 vm 获取 Metaspace 转储?