[ http://issues.apache.org/jira/browse/DERBY-1713?page=all ]

John H. Embretsen updated DERBY-1713:
-------------------------------------

    Attachment: Derby1713repro.java

I have not been able to try Ibrahim's Test1.java, since I am not able to 
decompress the database needed (my version of bzip2 tells me it (test.zip) is 
not a valid bzip2 archive - and I'm not using Windows (at the moment)).

Instead, I have created a fully reproducible test case which does not require 
having a database in advance. See attachment 'Derby1713repro.java'. To run, put 
derby.jar in your classpath and run:

$ java Derby1713repro

If you already have a DB to test with, you can run with the "haveDB" argument:

$ java Derby1713repro haveDB

The test case inserts 40k rows into a table (same DDL as Ibrahim described in 
previous comments), which results in a 30 MB database (unless "haveDB" is 
specified, in which case the test case only performs a query against an already 
existing database).

I think one important thing to do is to reduce as many variables as possible 
when trying to reproduce or debug a problem. With this repro, I do get an 
OutOfMemoryError (OOME) if the max heap size is 32 MB (-Xmx32M). This happens 
without using an inner class (as is done in Test1.java), and it even happens 
without executing a 'SELECT count(*)' statement. I have also tried commenting 
out the setFetchSize(60000) call, and the OOME still happens (Sun's jvm version 
1.5.0_06).

The problem seems to be the huge SELECT, FROM, WHERE statement. At start-up 
(when using the "haveDB" option), jstat reports a tenured space usage of 512 
bytes. When executing the query, tenured space usage increases to as much as 
30272 bytes, which is almost the whole heap. In addition, other parts of the 
heap need some space, hence we get an OutOfMemoryError. Feel free to use this 
repro as basis for creating a minimalistic test showing the problem.

I think Mike is right when he says that 32 MB max heap is not suitable ("safe") 
for this kind of database and this kind of usage. I therefore recommend 
lowering the Priority and Urgency of this Jira issue somewhat.

I also recommend changing the summary of this issue once the real problem has 
been positively identified. The fact that the JVM is not able to free memory 
following an OutOfMemoryEvent is as far as I can tell not a bug in Derby.



> Memory do not return to the system after Shuting down derby 10.2.1.0, 
> following an out of memory event
> ------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-1713
>                 URL: http://issues.apache.org/jira/browse/DERBY-1713
>             Project: Derby
>          Issue Type: Bug
>          Components: Performance
>    Affects Versions: 10.2.1.0
>         Environment: Windows XP SP2
> JRE 1.6 beta2
>            Reporter: Ibrahim
>            Priority: Critical
>         Attachments: Derby1713repro.java, test.zip, Test1.java
>
>
> I face a problem when querying large tables. I run the below SQL and it stuck 
> in this query and throws java heap exception OutOfMemory:
> SELECT count(*) FROM <table> WHERE .....
> N.B. I'm using a database of more than 90,000 records (40 MB). I set the 
> maxHeap to 32 MB (all other settings have the default value, pageCache ... 
> etc ). 
> Then, I shutdown the database but the memory is not returned to the system 
> (and remain 32 MB [max threshold]). I tried to increase the maxHeap to 128 MB 
> in which it works and releases the memory, so I think the problem is when it 
> reaches the maxHeap then it seems to not respond to anything such as closing 
> the connection or shutting down the database. How can I get rid of this? 
> (because i cannot increase the maxHeap as the database increases, I want to 
> throw an exception and release the memory)
> I'm using this to shutdown the DB:
> try{DriverManager.getConnection("jdbc:derby:;shutdown=true");}
> catch(SQLException ex){System.err.println("SQLException: " + 
> ex.getMessage());}
> I'm using a memory Profiler for monitoring the memory usage.
> Thanks in advanced.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to