dromara / hutool

🍬A set of tools that keep Java sweet.
https://hutool.cn
Other
28.91k stars 7.48k forks source link

6.0.0版本 BeanUtil会导致Metaspace溢出 #3671

Closed test-bin-001 closed 1 month ago

test-bin-001 commented 1 month ago

版本情况

JDK版本: openjdk_17 hutool版本: 6.0.0-M8

问题描述(包括截图)

  1. 复现代码

b03ef8a03a2e04de2987968b0b030664

  1. 堆栈信息

1721877914353_3FA9ACE6-00B9-4820-B1EB-467414517A4A 1721877931098_B13EEC11-8B4F-40cf-865C-8D2374B2D4C8 lQLPJwskBfb2Rk_NAvDNB1-wmLz7ddADBswGi5lfIaNMAA_1887_752

test-bin-001 commented 1 month ago

频繁GC会导致LambdaFactory产生的类在metaspace中堆积

VampireAchao commented 1 month ago

您好,麻烦能尝试最新版本还有这个问题吗,最好您方便的话帮忙给一个复现Demo供开发定位问题

test-bin-001 commented 1 month ago

6.0.0-M8和M14都测试过了,复现就一直gc就行,每次gc之后执行BeanUtil的copyProperties方法LambdaFactory都会生成一批类,但是因为是弱引用,gc后就没了,但是类加载器中类不会被卸载,导致metaspace一直增长

saberwangmi commented 1 month ago

@VampireAchao https://github.com/dromara/hutool/blob/v6-dev/hutool-core/src/main/java/org/dromara/hutool/core/func/LambdaFactory.java#L41 这里使用的是WeakConcurrentMap,GC后就会移除生成的缓存,但是Metaspace中加载的class并不会被卸载而导致的内存泄漏

如图:这些Lambda的class在每次GC后生成都会生成 image

VampireAchao commented 1 month ago

感谢!修复中

VampireAchao commented 1 month ago

https://gitee.com/dromara/hutool/issues/I99A2X

looly commented 1 month ago

@VampireAchao WeakCache中的对象被回收了,但是Lambda类加载器中的lambda对象没有回收。

looly commented 1 month ago

@test-bin-001

来自 @CherryRum 的回答:

可以见: https://github.com/openjdk/jdk/pull/12493

https://bugs.openjdk.org/browse/JDK-8302154

a9a50f5f5ba83917f1dc9ec29d7b5e3

jdk15改了 一个隐藏类,和 jdk8的lambda生成方式不同了

可能导致构建的lambda无法正常回收。

6.0.0-M15会改回使用MethodHandler反射方式。