-
-
Notifications
You must be signed in to change notification settings - Fork 9.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
插件卸载后已经加载的插件类无法被 unload #5615
Comments
/assign |
目前,我可以确认的是,在插件被卸载的时候,是调用了 主要是因为 unload classes 行为是 JVM GC 管理的。我尝试过手动 GC,可以查看到 unload classes 信息,示例如下所示: [2787.193s][info][class,unload] unloading class run.halo.s3os.S3LinkServiceImpl$TokenState 0x0000007001ed9cc0
[2787.193s][info][class,unload] unloading class software.amazon.awssdk.services.s3.model.CompletedPart 0x0000007001ed9a68 综上,这算是 JVM 默认的行为,不算是 Halo 的 bug。 |
可以试试其他的插件,比如应用市场客户端,或者 SEO 插件之类 |
Hi @JohnNiang 让我们来看一下示例:
首先我安装 plugin-cloudinary 插件启动并卸载后卸载后的类卸载情况如下: 应用市场插件而安装应用市场插件:,启动后,加载如下多的类,这些是会创建对象的: 结论因此这个问题,并不是在所有插件中都存在 我猜测原因是应用市场插件有自定义模型,在序列化和反序列化数据后会有类型引用被缓存到 Halo 的 Extension 提供的 Converter 的 ObjectMapper 的 BeanDeserializerBase 中导致此插件的 PluginClassLoader 无法被回收,从而其加载的类及其自身无法被卸载 ObjectMapper 具有多种缓存方式:
|
如果确实因为 ObjectMapper 持有了 classes,那这个问题似乎不是那么好解决。 另外,如果插件卸载后 classes 没有被 unload,目前会出现哪些比较严重的问题呢?如果引发的问题不是很严重,我建议暂时忽略这个问题。 |
经排查确实是这个原因导致的,插件如果定义了自定义模型,但是插件卸载之后 JSONExtensionConverter 的 ObjectMapper 的 插件类加载器现在的模式是先从插件找类找不到,在从 parent 找,因此还是会加载比较多类的,卸载之后会一直有 PluginClassLoader 实例在堆内存中,目前可能出现的问题是:
目前我能想到的就是这些,其他的暂不清楚 |
目前或许可以通过以下几种方式之一解决:
|
建议再排查一下这个问题,今天遇到一个疑似这个问题导致的错误。具体是升级了某个插件,导致插件的接口无法正常请求,重启插件无法解决,最后只能重启 Halo。 |
从日志中观察到,可能和 pf4j/pf4j#576 有关系。 |
…ependent plugin (#5855) #### What type of PR is this? /kind bug /area plugin /area core #### What this PR does / why we need it: This PR resolves the problem that some plugins could not be used after upgrading dependent plugin. #### Which issue(s) this PR fixes: Fixes #5615 #### Special notes for your reviewer: 1. Install plugin [app-store](https://www.halo.run/store/apps/app-VYJbF) 2. Install plugin [backup](https://www.halo.run/store/apps/app-dHakX) and activate it 3. Disable plugin app-store 4. Check the features of plugin backup 5. Enable plugin app-store 6. Check the features of plugin backup 7. Upgrade plugin app-store with the any versions 8. Check the features of plugin backup #### Does this PR introduce a user-facing change? ```release-note 修复因升级应用市场插件导致部分插件意外停止的问题 ```
System information
What is the project operation method?
Docker
What happened?
参考 https://github.com/halo-dev/rfcs/blob/main/plugin/pluggable-design.md#%E6%8F%92%E4%BB%B6%E5%8D%B8%E8%BD%BD
启动 Halo 时添加 JVM 参数
-Xlog:class+load=info -Xlog:class+unload=info
安装插件并启动后卸载后手动触发一次 gc 观察日志
只有 load 类的日志,没有unload 类的日志,已加载的类的数量也不会减少,猜测可能是有地方引用到了插件类加载器对象没有释放导致类加载器对象无法被回收所以它加载的类无法被 unload
Relevant log output
No response
Additional information
/kind bug
/area core
/area plugin
The text was updated successfully, but these errors were encountered: