Hi,

Some new tests have recently been added to the low-memory test suite that we have (you can run it with 'ant junit-lowmem'). I'm now seeing two problems:
 a) I get an OOME now and then
 b) It takes a long time to complete

Obviously, this looks like a memory leak in Derby. That's also pretty much correct, but it's what I'll call a "controlled memory leak". I believe the test I added for DERBY-4137 [1] is causing both (a) and (b). It worked fine before the latest test additions, but now the memory pressure is too high. The memory occupied for the 120'000 transactions amounted to around 4 MB.

In DERBY-4137, the use of a timer causes memory leaks. The leak will "self-correct" when the specified timeout duration has passed. In the test, this value has been set very high and there is no guarantee this won't happen in real-world applications either. In real-world applications the size of the memory leak is given by transaction rate and timeout value (the higher the tx rate and the longer the timeout value, the more memory is hogged). The fix only reduced the amount of memory leaked. In Java 5.0 there's a method that can be used to purge the queue, but using it seems to be a little bit complicated (i.e. when to invoke it). In any case, it will be easier to deal with this once we have sunset support for J2SE 1.4 [2].

I can think of the following actions to reduce the likelihood of this test causing problems:
 1) Run the test only as embedded (reduces memory usage to ~half)
2) Force execution order and run this test as the last test (this fixes the problem today, but it may reoccur if/when another test eats up more memory) 3) Reduce the timeout value such that the data can be garbage collected shortly after the test has been run (timing/performance sensitive)

Further, the following actions remove the problem altogether:
 i)   Delete the test.
 ii)  Run test in a separate VM.
 iii) Fix issue using Java 5.0 API.
      (some details to consider here)


For starters I will implement the changes suggested in (1) and (2). I will test with only (2) first to see if we are already at a point where the tests require more memory than what is available. See DERBY-5394 [3].


--
Kristian

[1] https://issues.apache.org/jira/browse/DERBY-4137.
[2] If this code is to be run on small platforms, we're back to square one. It's not a problem technically, the code will just be a lot more verbose and complex due to the use of reflection.
[3] https://issues.apache.org/jira/browse/DERBY-5394.

Reply via email to