]> gerrit.simantics Code Review - simantics/platform.git/blob - tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/MemoryLeakExperiment.java
Fixed multiple issues causing dangling references to discarded queries
[simantics/platform.git] / tests / org.simantics.scl.compiler.tests / src / org / simantics / scl / compiler / tests / MemoryLeakExperiment.java
1 package org.simantics.scl.compiler.tests;
2
3 import org.junit.Assert;
4 import org.junit.Before;
5 import org.junit.Test;
6 import org.simantics.scl.compiler.environment.specification.EnvironmentSpecification;
7 import org.simantics.scl.compiler.errors.CompilationErrorFormatter;
8 import org.simantics.scl.compiler.module.repository.ImportFailure;
9 import org.simantics.scl.compiler.module.repository.ImportFailureException;
10 import org.simantics.scl.compiler.module.repository.ModuleRepository;
11 import org.simantics.scl.compiler.runtime.RuntimeEnvironment;
12 import org.simantics.scl.compiler.top.ExpressionEvaluator;
13 import org.simantics.scl.compiler.top.SCLExpressionCompilationException;
14 import org.simantics.scl.compiler.types.Type;
15 import org.simantics.scl.compiler.types.Types;
16 import org.slf4j.Logger;
17 import org.slf4j.LoggerFactory;
18
19 public class MemoryLeakExperiment {
20     private static final Logger LOGGER = LoggerFactory.getLogger(MemoryLeakExperiment.class);
21     ModuleRepository moduleRepository;
22
23     EnvironmentSpecification environmentSpecification;
24
25     @Before
26     public void initialize() throws Exception {
27         moduleRepository = InitialRepository.getInitialRepository();
28
29         // Environment for compiling expressions
30         environmentSpecification = new EnvironmentSpecification();
31         environmentSpecification.importModule("Builtin", "");
32         environmentSpecification.importModule("Prelude", "");
33     }
34
35     private void testExpression0(String expressionText,
36             Object expectedValue,
37             Type expectedType) throws Exception {
38         
39         RuntimeEnvironment runtimeEnvironment;
40         try {
41             runtimeEnvironment = moduleRepository.createRuntimeEnvironment(environmentSpecification,
42                     getClass().getClassLoader());
43         } catch(ImportFailureException e) {
44             for(ImportFailure failure : e.failures)
45                 LOGGER.warn("Failed to import " + failure.moduleName);
46             throw e;
47         }
48
49         // Compiling and running expression
50         try {
51             Object result = new ExpressionEvaluator(runtimeEnvironment, expressionText)
52                     .expectedType(expectedType)
53                     .interpretIfPossible(false)
54                     .eval();
55             if(expectedValue != null)
56                 Assert.assertEquals(expectedValue, result);
57         } catch(SCLExpressionCompilationException e) {
58             LOGGER.error(CompilationErrorFormatter.toString(expressionText, e.getErrors()));
59             throw e;
60         }
61     }
62
63     @Test
64     public void testIt() throws Exception {
65         for(int i=0;i<1000000;++i) {
66             testExpression0("fst (\"a\", \"b\")", "a", Types.STRING);
67             if(i % 10000 == 0 && i > 0) {
68                 System.gc();
69                 System.runFinalization();
70                 System.gc();
71                 Thread.sleep(100L);
72                 double used = (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory());
73                 LOGGER.info(i + " " + used*1e-6 + " Mb, " + (used / i) + " b / expression");
74             }
75         }
76     }
77 }