新手求助。有关于socket接收长字符串,在一定时间后报出IOException的问题

vastsheen 2017-03-20 11:26:54
目前开发的功能流程如下:
1、用socket接收xml,该xml根据某种指定过的进行过加密。接收方式时用StringBuilder拼装,判断完成后转成了字符串。

protected String getContent(InputStream in) {
while (true) {
byte[] bufferMemory = new byte[2048];
int test = 0;
StringBuffer buffer = new StringBuffer();
try {
while ((test = in.read(bufferMemory)) != -1) {
buffer.append(new String(bufferMemory, 0, test));
if (buffer.indexOf("</root>") != -1) {
break;
}
}
return buffer.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}



2、接收后先对解密前的原xml字符串用文件输出流进行存储。(明文密文皆要做记录)
3、将原xml从文件重新读入(主要目的是为了利用BufferedReader.readLine()方法逐行读取,然后根据规则进行解密)。
4、循环按行读入开始:逐行读入原xml,根据读入的单行字符串判断该行是是否包含密钥信息(有密钥信息则获取密钥)、是否被加密(被加密则进行解密),处理完毕后将该行用文件输出流输出。循环到该文件读取完毕后结束。
5、上一步骤结束后会将文件地址返回给另一个功能模块,将解密后的明文在另一模块中用dom4j和文件输入流读入,形成Document对象。

public void getTempDoc(String fileName, ConnectionContentDto contentDto) {
FileInputStream in = null;
try {
in = new FileInputStream(fileName);
Document doc = sreader.read(in);
contentDto.setTempDoc(doc);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}



问题是:
在该功能运行大概两天以上之后会报出IOException异常,details里显示为java heap space。

相关信息:
1、环境是MyEclipse8.5,tomcat 6.0,解析jar包用的dom4j。
2、tomcat内存参数已扩大至1g
3、文件传输密文的频率大概是5分钟一次,密文平均一次1M,解密后明文大概300k。
4、检出过所有输入输出流是否关闭,均确认执行后已关闭。
5、该流程不算socket的输入输出流,使用了2次输出流,2次输入流。第二次输入流使用了Dom4j中的SAXReader对象的read()方法进行读入,该方法传入参数为文件输入流,且读取完成后该输入流也已经关闭。

向各位前辈提问:
1、该问题最有可能的触发原因会发生在哪一步?
2、如果信息不足以进行判断,有没有好的这方面的调试工具推荐一下?
3、该流程是否有可以优化的地方?
...全文
172 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
vastsheen 2017-03-20
  • 打赏
  • 举报
回复
引用 1 楼 u011619071 的回复:
分析一下gc日志,代码注意byte[] bufferMemory = new byte[2048]; 可以在finally中 bufferMemory = null; new String(bufferMemory, 0, test) 对象 做null处理,
好的多谢!我先把这块修改一下。待会再去检查一下日志看看能不能发现问题。非常感谢!
X元素 2017-03-20
  • 打赏
  • 举报
回复
分析一下gc日志,代码注意byte[] bufferMemory = new byte[2048]; 可以在finally中 bufferMemory = null; new String(bufferMemory, 0, test) 对象 做null处理,
vastsheen 2017-03-20
  • 打赏
  • 举报
回复
引用 3楼X元素 的回复:
[quote=引用 2 楼 vastsheen 的回复:] [quote=引用 1 楼 u011619071 的回复:] 分析一下gc日志,代码注意byte[] bufferMemory = new byte[2048]; 可以在finally中 bufferMemory = null; new String(bufferMemory, 0, test) 对象 做null处理,
好的多谢!我先把这块修改一下。待会再去检查一下日志看看能不能发现问题。非常感谢![/quote] 如果还是解决不了,除了tomcat ,项目的jvm参数也尝试配置一下,了解一下jvm调优相关知识,[/quote]好的!非常感谢!已经修改完毕,正在测试中。
X元素 2017-03-20
  • 打赏
  • 举报
回复
引用 2 楼 vastsheen 的回复:
[quote=引用 1 楼 u011619071 的回复:] 分析一下gc日志,代码注意byte[] bufferMemory = new byte[2048]; 可以在finally中 bufferMemory = null; new String(bufferMemory, 0, test) 对象 做null处理,
好的多谢!我先把这块修改一下。待会再去检查一下日志看看能不能发现问题。非常感谢![/quote] 如果还是解决不了,除了tomcat ,项目的jvm参数也尝试配置一下,了解一下jvm调优相关知识,

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧