稍微概括一下问题:
我们正在为我们的网站使用 liferay 门户解决方案,并添加一些功能并修复我们在门户中使用方面的错误。它本身的方面的数量在启动时不是问题,但它们有时开始编织的类加载器的数量是。
Liferay 使用 JRuby 对 CSS 文件执行 SASS 评估。每个被处理的 CSS 文件都有自己的 jruby 类加载器(我对 jruby 的了解有限,所以我不知道这是否是它应该工作的方式)。其结果是,如果同时执行大量 css/jruby 操作,内存可能会跳跃 1.5GB 并导致 JVM 内存不足。如果 JVM 在这个初始跳转中幸存下来,或者如果没有同时处理很多文件,那么内存使用会在一段时间后恢复正常。所以问题显然是由编织过程的内存开销引起的
在试图找到一个解决方案时,我想出了几个可以做的改变。但我不确定哪个更好,以及某些选项是否可行。
- 有没有办法排除一些类加载器被aspectj处理。在这种情况下,这将是 jrubyclassloader(从我搜索后发现的内容来看,我认为这是不可能的)
- jruby 是否可以以某种方式限制为仅使用 1 个类加载器,因为这会减少编织开销,如果这意味着 jruby 只能进行串行处理,那么这将不是问题
- 递归地限制由 aspectj 编织的类(不要认为在 aop.xml 中排除是要走的路,而是分别为每个方面添加 cflow 限制)