私はしばらくの間、この問題について頭を悩ませてきました。27K でエンコードされた文字列 (URL エンコードと同様) を取得し、それを 9K の "ISO-8859-1" プレーンテキスト文字列に戻しています。
byte outarray[] = new byte[decoded_msg_length]; // 9K
byte inarray[];
try {
inarray = instring.getBytes("ISO-8859-1"); // eg: "ÀÀÀÚßÐÀÀÃÐéÙÓåäàÈÂÁÙÈ...."
inarray = null; // free up whatever memory possible.
// ... for loop decodes chunks of 4 bytes...
Runtime runtime = Runtime.getRuntime();
System.out.println("freeMemory1="+runtime.freeMemory()); // freeMemory1=86441120
// yes I've tried methods like new String( outarray, "ISO-8859-1" );, etc.
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
byteStream.write(outarray);
outarray=null;
runtime.gc();
System.out.println("freeMemory2="+runtime.freeMemory()); //freeMemory2=133761568
// return new String(outarray,"ISO-8859-1"); // OutOfMemoryException thrown here
// return new String(outarray); // OutOfMemoryException thrown here too
return byteStream.toString("ISO-8859-1"); // OutOfMemoryException thrown here also
// sample output: "JOHN H SMITH 123 OAK ST..."
} catch( IOException ioe ) {
...
}
// Thrown exception:
Exception in thread "main" java.lang.OutOfMemoryError
at java.lang.StringCoding.decode(StringCoding.java:510)
at java.lang.String.<init>(String.java:232)
at java.io.ByteArrayOutputStream.toString(ByteArrayOutputStream.java:195)
...
記憶力は結構あるみたいです。この同じコードは、Windows の半分以下の空きメモリで問題なく動作します。これを単一のスタンドアロン クラスとして実行しています。JREメモリリークに関するLinuxエンコーディングの問題を知っている人はいますか?
$ java -version
java version "1.5.0"
Java(TM) 2 Runtime Environment, Standard Edition (build pxi32dev-20080315 (SR7))
IBM J9 VM (build 2.3, J2RE 1.5.0 IBM J9 2.3 Linux x86-32 j9vmxi3223-20080315 (JIT enabled)
J9VM - 20080314_17962_lHdSMr
JIT - 20080130_0718ifx2_r8
GC - 200802_08)
JCL - 20080314