gpt4 book ai didi

java - 如何在 webapp 中寻找内存泄漏?

转载 作者:行者123 更新时间:2023-11-28 22:26:35 24 4
gpt4 key购买 nike

我的网络应用程序内存泄漏问题很大。应用程序在很少人使用时大约 7 小时后内存不足。

我的应用是这样工作的:

  • 用户登陆登录页面,登录,登录成功用户 POJO 对象被添加到 session 映射中,如下所示:FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("用户", 用户);
  • 在每个后续页面请求中,AuthFilter 检查 session 映射中是否存在“用户”对象并允许进一步访问;
  • 我有 SessionScoped bean (LoggedUserBean),它保存用户信息(以及权限,在登录时初始化),因为它被非常频繁地访问。 LoggedUserBean 被注入(inject)到大多数 bean 中,也可以直接从 XHTML 页面访问。
  • 还有一些其他的 SessionScoped bean 应该保持它们的状态。大多数 bean 都注入(inject)了​​ DAO 对象(@Named,默认为 @Dependent)。很少有 bean 和所有 DAO 对象都注入(inject)了 DatabaseConnection 对象(@Named 和在构造函数中创建的数据源,如下所示: dataSource = (DataSource) new InitialContext().lookup("java:comp/env/" + "jdbc/MyResName"); ).
  • Primefaces 对话框的 validator (@Named)很少,可以验证动态创建的组件树:

<h:inputHidden value="true">
<f:validator binding="#{someValidator}"/>
</h:inputHidden>

实现是这样的:

@Named
public class SomeValidator extends ValidatorCommon implements Validator {

private final static Logger LOGGER = Logger.getLogger(SomeValidator.class);

@Override
public void validate(FacesContext fc, UIComponent uic, Object o) throws ValidatorException {...}
{...}

这是我的 context.xml:

<Resource auth="Container"
driverClassName="org.sqlite.JDBC"
maxTotal="1"
maxIdle="1"
minIdle="1"
maxWaitMillis="5000"
initialSize="1"
name="jdbc/MyResName"
type="javax.sql.DataSource"
removeAbandonedOnBorrow="true"
removeAbandonedTimeout="5"
logAbandoned="true"
validationQuery="SELECT 1"
url="jdbc:sqlite:path/to/db/db.db">
</Resource>

我用 VisualVM 创建了堆转储,MAT 显示了这个泄漏嫌疑人 (https://i.imgur.com/wGsnyt5.png):http://i.imgur.com/wGsnyt5.png

据我所知,每次请求/访问时都会创建 RequestScoped bean,而 SessionScoped 是从容器中为特定 session 检索的(或者如果它不存在则创建)所以即使我之间存在交叉引用beans,这一切都应该工作得很好。

这是我真正需要帮助的地方:如何分析这些泄漏的来源?肯定有不允许释放内存的东西,但是怎么才能找到呢?

我使用的是 Primefaces 6.0、Apache Tomcat (TomEE)/8.5.3 (7.0.1)、JDK 1.7.0_80-b15、Mojarra 2.2.6、sqlite-jdbc 3.14.2.1。

如果需要任何其他文件,请告诉我,我将编辑这篇文章以添加它们。

网络.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">

<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>

<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>

<context-param>
<param-name>primefaces.FONT_AWESOME</param-name>
<param-value>true</param-value>
</context-param>

<resource-env-ref>
<resource-env-ref-name>jdbc/MyResName</resource-env-ref-name>
<resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
</resource-env-ref>

<!-- Welcome page -->
<welcome-file-list>
<welcome-file>pages/pub/login.xhtml</welcome-file>
</welcome-file-list>

<!-- Error pages -->
<error-page>
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>/pages/pub/err/expired.xhtml</location>
</error-page>

<!-- Prevents comments in xhtml pages to be placed in final html and evaluated -->
<context-param>
<param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
<param-value>true</param-value>
</context-param>

<!-- JSF mapping -->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

<!-- Primefaces theme -->
<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>cupertino</param-value>
</context-param>

<session-config>
<session-timeout>120</session-timeout>
</session-config>

<filter>
<filter-name>forceUTF8CharSet</filter-name>
<filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>forceUTF8CharSet</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>

<mime-mapping>
<extension>ttf</extension>
<mime-type>application/font-sfnt</mime-type>
</mime-mapping>
<mime-mapping>
<extension>woff</extension>
<mime-type>application/font-woff</mime-type>
</mime-mapping>
<mime-mapping>
<extension>woff2</extension>
<mime-type>application/font-woff2</mime-type>
</mime-mapping>
<mime-mapping>
<extension>eot</extension>
<mime-type>application/vnd.ms-fontobject</mime-type>
</mime-mapping>
<mime-mapping>
<extension>eot?#iefix</extension>
<mime-type>application/vnd.ms-fontobject</mime-type>
</mime-mapping>
<mime-mapping>
<extension>svg</extension>
<mime-type>image/svg+xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>svg#latobold</extension>
<mime-type>image/svg+xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>svg#latoblack</extension>
<mime-type>image/svg+xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>svg#latolight</extension>
<mime-type>image/svg+xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>svg#latoregular</extension>
<mime-type>image/svg+xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>svg#fontawesomeregular</extension>
<mime-type>image/svg+xml</mime-type>
</mime-mapping>
</web-app>

最佳答案

也许可以从尝试 TomEE 7.0.2 开始。如果它没有帮助,则尝试调试 WebContext 映射以检查哪些 CDI bean 未发布,然后您将能够知道谁(tomee、tomcat、primefaces 等)对此负责并检查是否可以修复它。

关于java - 如何在 webapp 中寻找内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42377091/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com