#1519 - Memory leak when using @Cache(enableQueryCache=true) (#1523)

* #1519 - Memory leak when using @Cache(enableQueryCache=true)

* #1519 - Memory leak when using @Cache(enableQueryCache=true)

Remove unused TransactionEventBeans
This commit is contained in:
Rob Bygrave
2018-10-31 23:53:16 +13:00
committed by GitHub
parent 1f928e65a4
commit f928923b5b
14 changed files with 240 additions and 118 deletions
@@ -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;
}
+76
View File
@@ -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();
}
}
}