当前位置: 首页 > 知识库问答 >
问题:

Java8 Metaspace: OutOfMemoryError:处理反射通货膨胀

司马萧迟
2023-03-14

有很多链接和开放的Q

第一件事第一

问题:

java.lang.OutOfMemoryError:元空间

jvm:

java version:  "1.8.0_131"
vm:             Java HotSpot(TM) 64-Bit Server
vm args:       -Xms1024m -Xmx1024m -XX:MaxMetaspaceSize=128m

框架:

Spring, 冬眠, 检票口, 码头

嫌疑人1:

在使用期间,元空间逐渐增长,以下反射类按比例加载到元空间中[由jmap-histo cron jobs观察到]

sun.reflect.GeneratedConstructorAccessor1299
sun.reflect.GeneratedMethodAccessor6929
sun.reflect.GeneratedSerializationConstructorAccessor4220

可能的解决方案:

a、 由于我们正在使用大量处理反射内容的库,我们认为128m不足以容纳元空间中所有生成的XX类。因此,我们计划将元空间限制提高一倍-二十: 最大元空间大小=256m

B.我们不考虑设定以下条件

-D太阳.反射.无膨胀

-D阳光反射充气阈值

嫌疑人2:

完整的 GC 甚至在到达/占用完整配置的元空间(128m)之前就一直在运行,并且应用程序变得无响应/缓慢/有时 OOM,因为 jvm 只执行 FGC。

[全GC(元数据GC阈值)[PSYoung gGen:224K-

.

元空间使用147414K,容量155731K,promise159616K,保留1187840K
类空间使用17242K,容量19252K,promise20352K,保留1048576K

可能的解决方案:

-XX:压缩类空间大小在虚拟机启动时没有明确提及,这可能会导致过度保留地址空间,从而导致误导性提交的 sapce,从而导致完整的 GC。因此,显式设置 -XX:压缩类空间大小=256m 将有助于 vm 进行正确的内存规划

问题:

  1. 嫌疑人1:有人遇到过类似的问题并得到了解决吗
  2. 嫌疑犯2:设置-XX:CompressedClassSpaceSize是否真的在元空间规划/保留方面产生了影响并影响了GC?有指针吗
  3. 还有其他嫌疑人吗?建议

共有1个答案

夏侯华彩
2023-03-14

在花费了这么多时间之后,事实证明没有类泄漏,我们是受害者

“反射膨胀”

package sun.reflect;

/**
 The master factory for all reflective objects, both those in
 java.lang.reflect (Fields, Methods, Constructors) as well as their
 delegates (FieldAccessors, MethodAccessors, ConstructorAccessors).
**/

public class ReflectionFactory {


    // "Inflation" mechanism. Loading bytecodes to implement Method.invoke() and Constructor.newInstance() currently costs
    // 3-4x more than an invocation via native code for the first invocation (though subsequent invocations have been benchmarked
    // to be over 20x faster). Unfortunately this cost increases startup time for certain applications that use reflection
    // intensively (but only once per class) to bootstrap themselves. To avoid this penalty we reuse the existing JVM entry points
    // for the first few invocations of Methods and Constructors and then switch to the bytecode-based implementations.

我亲自验证了这一点,在每16次反射生成时,该技术被用于提高响应时间。

最后,我们增加了元空间,一切似乎都很好。

 类似资料:
  • 测试数据:D8A8E00821608F227AE473774E177216 压缩数据:789C 解压缩数据: 我的程序:

  • 本文向大家介绍C#反射内存的处理分析,包括了C#反射内存的处理分析的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了C#反射内存的处理。分享给大家供大家参考。具体分析如下: 这段时间由于公司的项目的要求,我利用c#的反射的机制做了一个客户端框架。客户端里的所有的模块都是以一定形式进行提供,例如:FORM,UserControl. 在做的过程中很简单与愉快。具体的过程如下: 1. 收集客户的需

  • 我应该像“老”方式那样做吗,还是应该用做些什么?我在想是否有人能给我指明正确的方向。因为我只能找到一种类型的例子。 我想要一张略有不同的牌的清单。或者我应该只使用和...不使用适配器和?

  • 考虑以下代码位: 计算机结果将在未来产生,那么val的引入将如何防止我将结果发送给错误的发件人?假设我有一个完全不同的发送者(发送者1和发送者2)。 Sender1 首先发送一条消息,然后发送 Sender2。如果没有上述方法中的 val,我清楚地看到我的 Sender2 有可能获得实际上针对 Sender1 的结果。 我不明白的是,val的引入将如何阻止我刚才描述的场景?

  • 在Spring的上个版本中,用户需要在web应用的上下文中定义一个或多个的HandlerMappingbean,用以将进入容器的web请求映射到合适的处理器方法上。允许在控制器上添加注解后,通常你就不必这么做了,因为RequestMappingHandlerMapping类会自动查找所有注解了@RequestMapping的@Controller控制器bean。同时也请知道,所有继承自Abstra

  • 我正在与我无法控制的遗留库集成。 它定义了以下接口: 这个“subscribe”方法被不同的线程频繁调用。我关心“Future.get()”的结果的唯一情况是当它失败时,所以我可以获取并处理异常。这不一定发生在调用线程中。另外,在“Future.get()”上阻塞调用线程对我来说是非常昂贵的,因为即使成功也可能需要几秒钟才能完成。 所以我的任务是以某种方式“后处理”所有这些期货,过滤失败的期货。基