首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

java写大量资料,内存不足

2013-06-26 
java写大量文件,内存不足RT,因为测试需要,决定用java制造大量小文件,大约80w个,但是当制造到10w个左右的时

java写大量文件,内存不足
RT,因为测试需要,决定用java制造大量小文件,大约80w个,但是当制造到10w个左右的时候,就因为内存不足给终止了,现在把关键代码贴出来,求大神指点一下啊……

//每天的文件存储在对应目录下,如1991/09/24产生的文件就存在1991/09/24目录下
for (; startTime <= stopTime; startTime = MyUtil.getTomorrow(startTime)) {
//生成父路径
parentPath =  basepathOfFiles + File.separator + startTime
/ 10000 + File.separator + MyUtil.filenameFormat((startTime / 100) % 100, 2)
+ File.separator + MyUtil.filenameFormat(startTime % 100, 2);
file = new File(parentPath);
file.mkdirs();
//产生每天的小文件
for (int i = 0; i < numOfFiles; i++) {
//生成小文件名
pathOfFile = parentPath + File.separator + MyUtil.filenameFormat(i, 5)
+ ".txt";
try {
//开始写了
writer = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(pathOfFile), "UTF-8"));
writer.write("" + startTime + MyUtil.filenameFormat(i, 3));
writer.write(cContent);
System.out.println("write " + pathOfFile + " ok!");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}

}
}
}
Java 内存 大量文件
[解决办法]

//每天的文件存储在对应目录下,如1991/09/24产生的文件就存在1991/09/24目录下
for (; startTime <= stopTime; startTime = MyUtil.getTomorrow(startTime)) {
//生成父路径
parentPath =  basepathOfFiles + File.separator + startTime
/ 10000 + File.separator + MyUtil.filenameFormat((startTime / 100) % 100, 2)
+ File.separator + MyUtil.filenameFormat(startTime % 100, 2);
file = new File(parentPath);
file.mkdirs();
//产生每天的小文件
for (int i = 0; i < numOfFiles; i++) {
//生成小文件名
pathOfFile = parentPath + File.separator + MyUtil.filenameFormat(i, 5)
+ ".txt";
try {
//开始写了
writer = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(pathOfFile), "UTF-8"));
writer.write("" + startTime + MyUtil.filenameFormat(i, 3));
writer.write(cContent);
System.out.println("write " + pathOfFile + " ok!");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
writer = null;} catch (Exception e) {


e.printStackTrace();
}
}

}
}

parentPath = null;
file = null;}



试试这样
[解决办法]
我简化了下你的代码如下。然后自己执行到了20w条左右,没有问题。

代码执行的过程中,我观察虚拟机的内存回收,一切正常。
// jps命令用来看系统里运行的java程序的进程号(也可以用资源管理器看):
C:\Users\Tom>jps
1912
1220 FileMake
5024 Jps
// jstat用来观察1220这个进程的内存使用情况。
// 前5列是不同的内存分区,YGC和FGC是垃圾回收次数。只要前5列内存不会一直在高位就表示内存正常。
// 这是我执行到20多w后看到的数据。
C:\Users\Tom>jstat -gcutil 1220 500 0
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
  0.00   4.31  63.48   0.11  16.92    683    0.234     0    0.000    0.234
  0.00   3.48   0.10   0.11  16.92    685    0.234     0    0.000    0.234
  4.31   0.00   7.21   0.11  16.92    686    0.235     0    0.000    0.235
  0.00   3.48  53.79   0.11  16.92    687    0.235     0    0.000    0.235
  0.00   3.48  75.90   0.11  16.92    687    0.235     0    0.000    0.235
  4.33   0.00  92.20   0.11  16.92    688    0.235     0    0.000    0.235

你可以比较你的代码和我的代码的区别,我觉得内存泄露的地方可能是你的MyUtil类。
你可以专门对其中的函数filenameFormat做下这样的大数据量测试试试。

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class FileMake {
public static void main(String[] args) throws IOException {
BufferedWriter writer = null;
String dirPath = "d:\\fileMake";
File file = new File(dirPath);
file.mkdirs();
// 产生每天的小文件
for (int i = 0; i < 800000; i++) {
// 生成小文件名
String pathOfFile = dirPath + "\" + i + ".txt";
try {
// 开始写了
writer = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(pathOfFile), "GBK"));
writer.write("" + i);
writer.write("--" + System.currentTimeMillis());
writer.flush();
System.out.println("write " + pathOfFile + " ok!");
} catch (Exception e) {
e.printStackTrace();
} finally {
writer.close();
}
}
}
}

热点排行