mirror of
https://github.com/ebean-orm/ebean.git
synced 2024-04-21 10:51:47 +00:00
* #1519 - Memory leak when using @Cache(enableQueryCache=true) * #1519 - Memory leak when using @Cache(enableQueryCache=true) Remove unused TransactionEventBeans
This commit is contained in:
@@ -93,9 +93,9 @@ public class PlatformNoGeneratedKeysTest {
|
||||
return EbeanServerFactory.create(config);
|
||||
}
|
||||
|
||||
static class OtherH2Platform extends H2Platform {
|
||||
public static class OtherH2Platform extends H2Platform {
|
||||
|
||||
OtherH2Platform() {
|
||||
public OtherH2Platform() {
|
||||
super();
|
||||
this.platform = Platform.GENERIC;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
package org;
|
||||
|
||||
import io.ebean.Ebean;
|
||||
import io.ebean.EbeanServer;
|
||||
import io.ebean.EbeanServerFactory;
|
||||
import io.ebean.Transaction;
|
||||
import io.ebean.annotation.Cache;
|
||||
import io.ebean.config.PlatformNoGeneratedKeysTest;
|
||||
import io.ebean.config.ServerConfig;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.Lob;
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
*
|
||||
* Test preparation:
|
||||
*
|
||||
* - Enable file based H2 in ebean.properties (line `datasource.h2.databaseUrl=jdbc:h2:file:~/tests`)
|
||||
* - disable logging of io.ebean.SUM/TXN/SQL in logback-test.xml
|
||||
* - remove existing database in ~/tests (do that before each run)
|
||||
* - run this class with `-Xmx1g` jvm argument
|
||||
* - an OOM in iteration ~45000 will occur (45k * 10k chars = 45k * 20k bytes = 900MB)
|
||||
*
|
||||
* remove the line `@Cache(enableQueryCache=true)` - and it will run forever (until disk is full)
|
||||
*/
|
||||
public class MainMemoryLeak {
|
||||
|
||||
@Cache(enableQueryCache=true)
|
||||
@Entity
|
||||
public static class ECachedBean {
|
||||
@Id
|
||||
private Long id;
|
||||
|
||||
@Lob
|
||||
private String description;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
PlatformNoGeneratedKeysTest.OtherH2Platform platform = new PlatformNoGeneratedKeysTest.OtherH2Platform();
|
||||
|
||||
ServerConfig config = new ServerConfig();
|
||||
|
||||
config.setDatabasePlatform(platform);
|
||||
config.addClass(ECachedBean.class);
|
||||
config.loadFromProperties();
|
||||
|
||||
EbeanServer server = EbeanServerFactory.create(config);
|
||||
|
||||
// create a string with 10k chars
|
||||
char[] c = new char[10_000];
|
||||
Arrays.fill(c, 'x');
|
||||
|
||||
try (Transaction txn = server.beginTransaction()) {
|
||||
for (int i = 0; i < 500000; i++) {
|
||||
|
||||
if (i % 1000 == 0) {
|
||||
long mem = Runtime.getRuntime().freeMemory() / 1024 / 1024;
|
||||
if (mem > 1024) {
|
||||
throw new IllegalStateException("-Xmx1g JVM argument expected");
|
||||
}
|
||||
System.out.println("Iteration: " + i + " Free mem: " + mem + " MB");
|
||||
}
|
||||
|
||||
ECachedBean a = new ECachedBean();
|
||||
a.description = new String(c);
|
||||
server.save(a);
|
||||
}
|
||||
System.out.println("Success, no mem limit detected");
|
||||
txn.commit();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -56,6 +56,10 @@ ebean.migration.migrationPath=dbmigration/myapp
|
||||
## -------------------------------------------------------------
|
||||
|
||||
|
||||
datasource.db.username=sa
|
||||
datasource.db.password=
|
||||
datasource.db.databaseUrl=jdbc:h2:file:~/tests
|
||||
datasource.db.databaseDriver=org.h2.Driver
|
||||
|
||||
datasource.h2.username=sa
|
||||
datasource.h2.password=
|
||||
|
||||
@@ -82,16 +82,16 @@
|
||||
<logger name="org.avaje.docker" level="TRACE"/>
|
||||
<!--<logger name="io.ebean.DDL" level="DEBUG"/>-->
|
||||
|
||||
<logger name="io.ebean.SQL" level="TRACE"/>
|
||||
<logger name="io.ebean.TXN" level="TRACE"/>
|
||||
<logger name="io.ebean.SUM" level="TRACE"/>
|
||||
<!--<logger name="io.ebean.SQL" level="TRACE"/>-->
|
||||
<!--<logger name="io.ebean.TXN" level="TRACE"/>-->
|
||||
<!--<logger name="io.ebean.SUM" level="TRACE"/>-->
|
||||
|
||||
<logger name="io.ebean.cache.TABLEMOD" level="TRACE"/>
|
||||
<!--<logger name="io.ebean.cache.TABLEMOD" level="TRACE"/>-->
|
||||
|
||||
<logger name="io.ebean.cache.QUERY" level="TRACE"/>
|
||||
<logger name="io.ebean.cache.BEAN" level="TRACE"/>
|
||||
<logger name="io.ebean.cache.NATKEY" level="TRACE"/>
|
||||
<logger name="io.ebean.cache.COLL" level="TRACE"/>
|
||||
<!--<logger name="io.ebean.cache.QUERY" level="TRACE"/>-->
|
||||
<!--<logger name="io.ebean.cache.BEAN" level="TRACE"/>-->
|
||||
<!--<logger name="io.ebean.cache.NATKEY" level="TRACE"/>-->
|
||||
<!--<logger name="io.ebean.cache.COLL" level="TRACE"/>-->
|
||||
|
||||
<!--<logger name="io.ebeaninternal.server.deploy" level="TRACE"/>-->
|
||||
|
||||
|
||||
Reference in New Issue
Block a user