今日在resin的dump heap中发现大量的char[]和byte[]对象:
[quote]
1.0000 112.922M 7.613M 105.309M 166308 java.util.HashMap
[b]0.8115 97.763M 97.763M 0.000M 483874 char[]
0.7928 89.842M 89.842M 0.000M 15243 byte[] [/b]
0.7869 88.862M 16.175M 72.687M 706694 java.util.HashMap$Entry
0.5190 58.608M 11.225M 47.382M 490447 java.lang.String
0.3688 41.640M 9.187M 32.453M 170271 java.util.HashMap$Entry[]
0.2521 28.465M 0.021M 28.444M 455 com.caucho.db.store.ReadBlock
[/quote]
加起来竟然有200M之大,马上就想起了一个低层的截字符串的函数使用了byte[]和char[],而且使用率非常频繁,平均每个页面都会调用100-150次左右。
发现byte[] b和char[] tempchar 使用完后没有释放(本人不太相信GC),手动释放一下,在return 前加:
[quote]
1.0000 112.989M 7.625M 105.364M 166567 java.util.HashMap
0.7867 88.893M 16.189M 72.704M 707325 java.util.HashMap$Entry
[b]0.5333 60.252M 60.252M 0.000M 497341 char[] [/b]
0.5281 59.665M 11.515M 48.151M 503080 java.lang.String
[b]0.4842 54.709M 54.709M 0.000M 17755 byte[] [/b]
0.3689 41.682M 9.209M 32.473M 170534 java.util.HashMap$Entry[]
[/quote]
重构后虽然变小了,但也很大。不知道是哪个地方使用了char[]和byte[],或者其它包使用了又没有释放。
[quote]
1.0000 112.922M 7.613M 105.309M 166308 java.util.HashMap
[b]0.8115 97.763M 97.763M 0.000M 483874 char[]
0.7928 89.842M 89.842M 0.000M 15243 byte[] [/b]
0.7869 88.862M 16.175M 72.687M 706694 java.util.HashMap$Entry
0.5190 58.608M 11.225M 47.382M 490447 java.lang.String
0.3688 41.640M 9.187M 32.453M 170271 java.util.HashMap$Entry[]
0.2521 28.465M 0.021M 28.444M 455 com.caucho.db.store.ReadBlock
[/quote]
加起来竟然有200M之大,马上就想起了一个低层的截字符串的函数使用了byte[]和char[],而且使用率非常频繁,平均每个页面都会调用100-150次左右。
public static String subContentStringOrial(String str, int targetCount,String more)
{
if (str == null)
return "";
int initVariable = 0;
StringBuffer restr = new StringBuffer();
if (str.length() <= targetCount)
return str;
String s1=null;
byte[] b;
char[] tempchar = str.toCharArray();
for (int i = 0; (i < tempchar.length && targetCount > initVariable); i++) {
s1 = String.valueOf(tempchar[i]);
b = s1.getBytes();
initVariable += b.length;
restr.append(tempchar[i]);
}
if (targetCount == initVariable || (targetCount == initVariable - 1)) {
restr.append(more);
}
return restr.toString();
}
发现byte[] b和char[] tempchar 使用完后没有释放(本人不太相信GC),手动释放一下,在return 前加:
b = null;
tempchar = null;
s1=null;
[quote]
1.0000 112.989M 7.625M 105.364M 166567 java.util.HashMap
0.7867 88.893M 16.189M 72.704M 707325 java.util.HashMap$Entry
[b]0.5333 60.252M 60.252M 0.000M 497341 char[] [/b]
0.5281 59.665M 11.515M 48.151M 503080 java.lang.String
[b]0.4842 54.709M 54.709M 0.000M 17755 byte[] [/b]
0.3689 41.682M 9.209M 32.473M 170534 java.util.HashMap$Entry[]
[/quote]
重构后虽然变小了,但也很大。不知道是哪个地方使用了char[]和byte[],或者其它包使用了又没有释放。