0

稍微概括一下问题:
我们正在为我们的网站使用 liferay 门户解决方案,并添加一些功能并修复我们在门户中使用方面的错误。它本身的方面的数量在启动时不是问题,但它们有时开始编织的类加载器的数量是。
Liferay 使用 JRuby 对 CSS 文件执行 SASS 评估。每个被处理的 CSS 文件都有自己的 jruby 类加载器(我对 jruby 的了解有限,所以我不知道这是否是它应该工作的方式)。其结果是,如果同时执行大量 css/jruby 操作,内存可能会跳跃 1.5GB 并导致 JVM 内存不足。如果 JVM 在这个初始跳转中幸存下来,或者如果没有同时处理很多文件,那么内存使用会在一段时间后恢复正常。所以问题显然是由编织过程的内存开销引起的

在试图找到一个解决方案时,我想出了几个可以做的改变。但我不确定哪个更好,以及某些选项是否可行。

  1. 有没有办法排除一些类加载器被aspectj处理。在这种情况下,这将是 jrubyclassloader(从我搜索后发现的内容来看,我认为这是不可能的)
  2. jruby 是否可以以某种方式限制为仅使用 1 个类加载器,因为这会减少编织开销,如果这意味着 jruby 只能进行串行处理,那么这将不是问题
  3. 递归地限制由 aspectj 编织的类(不要认为在 aop.xml 中排除是要走的路,而是分别为每个方面添加 cflow 限制)
4

2 回答 2

0

我很确定 aop.xml 文件中的配置是可行的方法。请参阅https://www.eclipse.org/aspectj/doc/next/devguide/ltw-configuration.html您将需要使用排除选项。

文档中的一个示例:

        <weaver options="-verbose">
          <!-- Weave types that are within the javax.* or org.aspectj.*
               packages. Also weave all types in the foo package that do
               not have the @NoWeave annotation. -->
          <include within="javax.*"/>
          <include within="org.aspectj.*"/>
          <include within="(!@NoWeave foo.*) AND foo.*"/>

          <!-- Do not weave types within the "bar" pakage -->
          <exclude within="bar.*"/>

          <!-- Dump all types within the "somepack" package,
               both before are after they are woven,
               to the "./_ajdump" folder on disk (for diagnostic purposes) -->
          <dump within="somepack.*" />
        </weaver>
于 2013-03-28T13:25:17.843 回答
0

对于谁可能需要1的答案。问题是,您可以使用aj.weaving.loadersToSkip参数来跳过类加载器。您需要将此参数作为 vm 参数传递。

例如:

-Daj.weaving.loadersToSkip=weblogic.utils.classloaders.GenericClassLoader
于 2020-09-07T21:05:15.323 回答