您的位置:程序门 -> websphere ->



读写大文件在linux下占用大量内存且不会释放?【急】 


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


读写大文件在linux下占用大量内存且不会释放?【急】
发表于:2007-12-28 20:37:01 楼主
代码如下:  
public       void       copyfile(string       oldpath,       string       newpath)       throws       exception  
{  

int       bytesum       =       0;  
int       byteread       =       0;  
file       oldfile       =       new       file(oldpath);  
if       (oldfile.exists())  
{       //文件存在时          
inputstream       instream       =       new       fileinputstream(oldpath);       //读入原文件          
fileoutputstream       fs       =       new       fileoutputstream(newpath);  
byte[]       buffer       =       new       byte[1444];  
int       length;  
while       ((byteread       =       instream.read(buffer))       !=       -1)  
{  
bytesum       +=       byteread;       //字节数           文件大小          
//system.out.println(bytesum);  
fs.write(buffer,       0,       byteread);  
}  
instream.close();  
fs.close();  
}  

}  

这段代码在本地windows下运行copy大的文件(例如100m以上)检测内存的使用发现只是使用了buffer大小的内容,  
但是放到linux系统websphere的jsp/servlet运行用top命令检测发现占用了大量的内存,并且程序执行完毕之后内存占用率仍然高居不下。  

其实我原本的问题是在websphere上的一个servlet用ftp从另外一台linux服务器读取文件(inputstream)然后把inputstream的字节流out       put到客户端给客户下载,但是发现这里的读取/写入操作占用了大量的内存,就跟上面的复制文件情况相似。问题出在in/out       stream的操作上,但是windows下运行却没有这样的问题。  

期盼各位鼎立相助,在下感激不尽!
发表于:2007-12-29 08:24:151楼 得分:0
设置一下websphere的jvm内存参数试一试,方法如下:

从管理控制台中选择   servers   =>   application   servers   -=>   server_name   =>   process   definition   =>   java   virtual   machine,将   initial   heap   size   设置为   256,   maximum   heap   size   设置为   512。

其中的具体数值,你可以根据需要自己调节一下
发表于:2008-01-01 16:39:452楼 得分:0
能解释一下这个参数的具体含义吗?不能胡乱设置啊,谢谢
发表于:2008-01-01 18:26:213楼 得分:0
initial       heap       size   表示当你的jvm启动时,操作系统为你的jvm分配的初始内存
maximum       heap       size   表示你的jvm最大可以使用的内存,如果jvm请求的内存超过此值,jvm就会执行垃圾回收

这两个参数分别相当于jvm的-xms和-xmx
发表于:2008-01-06 11:51:334楼 得分:0
好的,谢谢。
我把heap   size设置成   initial=16m,   maximum=32就好像没问题了,
但是我的另外一个程序要将heap   size设置成initial=0,   maximun=512,
这个程序是要parse一个xml文件成为xml   dom的,设得太小就不够用。
很矛盾啊。
发表于:2008-01-06 12:22:445楼 得分:0
不知道这个方法是否有用,你可以在这语句
fs.write(buffer,               0,               byteread);      

后面加一个
fs.flush();

我觉得这样性能上会差一点,但是能够节省内存。


发表于:2008-01-06 16:44:076楼 得分:0
试过了,还是一样的,flush()主要是将buffer写出去,默认的buffer并不大
发表于:2008-01-06 18:01:597楼 得分:0
那好像只能做一个heapdump查一下内存被什么占了,或者作两个heapdump比较一下什么在增长,这儿有个例子(使用jacl脚本做的):

生成heap   dump文件

was6.1中,在使用ibm   jdk的平台上,可以直接使用以下的方法,随时生成所需的heapdump文件。如果在性能诊断顾问程序配置里面选中了"启用自动堆转储收集,则可以自动在websphere   profile所在的路径下(例如/opt/ibm/websphere/was6.1/profiles/appsrv01)生成heapdump文件,备用户进行分析。

在使用ibm   sdk的平台上,例如aix,   linux和windows,在启用了性能诊断顾问工具后,如果探测到有内存泄漏发生,websphere会自动生成两个heapdump文件,供后续分析使用。

我们在任何时候,可以随时手动生成所需的heap   dump文件。在was6.1   profile的bin目录下,首先运行wsadmin   脚本客户端,然后可以调用generateheapdump操作来完成。

关键步骤:

1.   找到jvm对象名字。


<wsadmin>   set   objectname   websphere:type=jvm,process= <websphere服务器名字> ,node= <节点名字> ,*]
 


2.   对jvm   mbean调用generateheapdump操作。


<wsadmin>   $admincontrol   invoke   $objectname   generateheapdump  



快速检索

最新资讯
热门点击