From: | Kohei Nozaki <kyle(at)nailedtothex(dot)org> |
---|---|
To: | pgsql-jdbc(at)postgresql(dot)org |
Subject: | AbstractJdbc2ResultSet.FAST_NUMBER_FAILED brings class loader leak |
Date: | 2015-10-12 11:46:00 |
Message-ID: | 561B9D78.8090106@nailedtothex.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-jdbc |
Hello, I'm working on fixing the issue "java.lang.OutOfMemoryError:
Metaspace" in the time of redeploy where running an web application on
Tomcat.
I have acquired a heap dump and found a weird Root GC reference which is
connected to org.postgresql.jdbc2.AbstractJdbc2ResultSet. The heap dump
shows that it saves a (intentionally constructed) NumberFormatException
in a private static final field FAST_NUMBER_FAILED and that field has
backtrace field which references a Servlet class that loaded by
WebappClassLoader.
Here's a screenshot of Eclipse Memory Analyzer:
http://www.nailedtothex.org/roller/kyle/mediaresource/2fabd2a0-10a3-4d45-b8c8-589763d15824
I think AbstractJdbc2ResultSet should stop saving a intentionally
constructed Exception in a static field because it creates a strong
reference to a class which invoked the database operation at the first
time regardless if it's loaded by WebappClassLoader. It will be a cause
of class loader leak.
[Steps to reproduce]
1. Put postgresql-9.3-1100.jdbc41.jar to $TOMCAT_HOME/lib
2. Put following element to $TOMCAT_HOME/conf/context.xml
<Resource name="jdbc/PostgreSQLDS"
url="jdbc:postgresql://localhost:5432/somedb"
driverClassName="org.postgresql.Driver"
username="postgres"
password="***"
auth="Container"
type="javax.sql.DataSource"
maxActive="20"
maxIdle="5"
maxWait="10000"/>
3. git clone https://github.com/lbtc-xxx/jdbc-servlet
4. cd jdbc-servlet; mvn clean package
5. deploy the WAR
6. visit http://localhost:8080/jdbc-servlet-1.0-SNAPSHOT
7. undeploy and deploy the WAR several times (keep your JVM running)
8. acquire heap dump and load it with Eclipse Memory Analyzer
[My environment]
* postgresql-9.3-1100.jdbc41.jar
* Tomcat 8.0.18
* Oracle JDK 8u60
* PostgreSQL 9.3.4
Thanks.
From | Date | Subject | |
---|---|---|---|
Next Message | Dave Cramer | 2015-10-12 13:43:45 | Re: AbstractJdbc2ResultSet.FAST_NUMBER_FAILED brings class loader leak |
Previous Message | Dave Cramer | 2015-10-11 14:21:03 | Re: Release 1204 released |