Java SuSE Linux中ISO-8859-1编码时toString中的OutOfMemory错误

Java SuSE Linux中ISO-8859-1编码时toString中的OutOfMemory错误,java,linux,out-of-memory,iso-8859-1,Java,Linux,Out Of Memory,Iso 8859 1,我在这个问题上绞尽脑汁已经有一段时间了。我使用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

我在这个问题上绞尽脑汁已经有一段时间了。我使用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相比,Linux环境中的Java堆大小可能有不同的默认限制。您可以通过Runtime.maxMemory()方法对此进行检查。 ()

如果Linux下的限制较小,则可以通过-Jmx命令行参数将其增加到java

java -Xmx1024m YourClassNameHere

1024m将堆的大小增加到1GB,您可以根据需要调整大小。这是一个最大值,您的程序可能会使用更少的量。

我找到了解决方案,但我不确定它发生的确切原因-很可能是某个内部静态缓冲区变量。即使错误在toString上抛出,修复方法是将解码的\u msg\u长度调整为与instring相同

出于某种原因,我还并没有弄清楚,instring.getBytes(“ISO-8859-1”)设置了由byteStream.toString(“ISO-8859-1”)填充的一些内部缓冲区的大小。将decoded_msg_length的大小设置为比该长度短一个字节会导致Java抛出错误,即使没有线程不安全的情况,我使用的是两个不同的变量

最重要的是,我可以使用CharsetDecoder,但它仍然会失败。我将把它归为OS JVM错误。如果没有这种奇怪的修复,代码在其他操作系统和JVM中可以正常工作

java -Xmx1024m YourClassNameHere