[jsword-devel] [JIRA] Resolved: (JS-132) Improve memory use in Zip.java

DM Smith (JIRA) jira at crosswire.org
Fri Nov 26 04:36:24 MST 2010


     [ http://www.crosswire.org/bugs/browse/JS-132?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

DM Smith resolved JS-132.
-------------------------

    Fix Version/s: 1.6.1
       Resolution: Fixed

Many thanks! This should help out even on big devices.

> Improve memory use in Zip.java
> ------------------------------
>
>                 Key: JS-132
>                 URL: http://www.crosswire.org/bugs/browse/JS-132
>             Project: JSword
>          Issue Type: Bug
>          Components: o.c.common.compress
>         Environment: Android
>            Reporter: Martin Denham
>            Assignee: DM Smith
>             Fix For: 1.6.1
>
>
> Android devices have very little memory and developers have to be very careful to avoid OutOfMemoryError.  When I started using JSword on Android I often had OutOfMemoryErrors but they almost disappeared after this change.
> Current JSword code in Zip.java uncompress(..)
>         ByteArrayOutputStream bos = new ByteArrayOutputStream();
>         BufferedOutputStream out = new BufferedOutputStream(bos, expectedLength);
> There are 2 possible improvements here:
> 1. the ByteArrayOutputStream constructor can be passed an expectedLength parameter to avoid up to 2 times the required amount of memory being allocated (it doubles the buffer size when it runs out).
> 2. Both the ByteArrayOutputStream and BufferedOutputStream use similar data structures to cache data (buf = new byte[size];) and so it seems that the buffer is buffering a buffer so there is redundant buffering which would use twice the required amount of memory.
> So the suggested replacement for the above is:
>         ByteArrayOutputStream out = new ByteArrayOutputStream(expectedLength);
> which would require possibly one third of the memory of that required by the current JSword code.
> The complete code that And Bible is currently using is here (only the first line in the method is modified):
>     public ByteArrayOutputStream uncompress(int expectedLength) throws IOException {
>         ByteArrayOutputStream out = new ByteArrayOutputStream(expectedLength);
>         InflaterInputStream in = new InflaterInputStream(input, new Inflater(), expectedLength);
>         byte[] buf = new byte[expectedLength];
>         for (int count = in.read(buf); count != -1; count = in.read(buf)) {
>             out.write(buf, 0, count);
>         }
>         in.close();
>         out.flush();
>         out.close();
>         return out;
>     }
> I have raised this as a Major bug because it is for Android but I realise it would be Minor for most other environments.

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

        



More information about the jsword-devel mailing list