我们有一个用 Java 制作的 Web 应用程序,它使用 struts2、spring 和 JasperReport。此应用程序在 glassfish 4.0 上运行。
该应用程序的库位于 WEB-INF/lib 文件夹中,并且在 glassfish 中安装了 4 个以上使用相同的库。
Glassfish 配置为使用 1024mb 的堆空间和 512m 的 permgen,当我使用每个应用程序的库时,大部分内存消耗都在 struts 操作和 spring aop 类中(使用 netbeans 分析器)。
我们遇到的问题是每个应用程序的类加载器中的库消耗的内存量很高,并且会产生 PermGen 错误,而且我们还注意到应用程序在用户越多时运行速度越慢。
因此我们尝试使用共享库,将其放在 domain1/lib 文件夹中,发现使用单个部署的应用程序的加载时间和内存消耗要低得多,并且应用程序通常运行得更快。但是当我们在服务器上部署其余的应用程序时,只有第一个加载的应用程序运行良好,其余的在我们调用 struts2 操作时会出错。我们认为这是因为每个应用程序在 struts2 和 log4j 上的设置略有不同。
我们还尝试仅将某些库放在 glassfish 上并仅将 struts2 留在应用程序中,但它显示 InvocationTargetException 错误,因为所有库都依赖于 apache-common 的库,并且我们将这些库放在一个地方还是另一个地方都没有关系。此外,如果我们把它放在两个地方,应用程序也不会启动。
- 使用共享库有什么特殊设置或最佳实践吗?
- 有没有办法使用共享库但为每个应用程序加载设置?或者我们必须更改设置以使它们都相同?