package ringBuffer;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;
public class PerformanceWriteTest {
/**
* @param args
*/
public static void main(String[] args) {
String outputFile = "F:\\test\\ioTest.txt";
Long length = 0L ;
Long totalTime = 0L;
// try {
// raf = new RandomAccessFile("F:\\test\\ioTest.txt", "rw");
// FileChannel fc = raf.getChannel();
// mbb = fc.map(MapMode.READ_WRITE, 0, 85*1024*1024);
// } catch (FileNotFoundException e) {
// e.printStackTrace();
// } catch (IOException e) {
// e.printStackTrace();
// }
for (int j = 0; j < 5; j++) {
StringBuffer sb = new StringBuffer();
for (Integer i = 0; i < 1000000; i++) {
sb.append(j+i.toString() + "V");
}
sb.append("S");
length = (long) sb.toString().length() ;
long start = System.currentTimeMillis() ;
appendFileTest(outputFile,sb.toString());
totalTime = totalTime + (System.currentTimeMillis() - start) ;
}
System.out.println(" Total Data is : " + length*5/1000 + " Kbytes! ") ;
System.out.println(" Total Time is : " + totalTime) ;
System.out.println(" Averge Speed is :" + length*5/(totalTime*1000) + " Kbytes");
}
private static void appendFileTest(String outputFile, String msgs) {
// append1(outputFile, msgs) ; //FileOutputStream
// append2(outputFile, msgs) ; //FileWriter
append3(outputFile, msgs) ; //RandomAccessFile
// append4(outputFile, msgs) ; //RandomAccessFile
}
private static void append1(String outputFile, String msgs) {
BufferedWriter out = null;
try {
out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(outputFile, true)));
out.append(msgs) ;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static void append2(String outputFile, String msgs) {
try {
FileWriter writer = new FileWriter(outputFile, true); // 打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件
writer.write(msgs);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void append3(String outputFile, String msgs) {
try {
RandomAccessFile randomFile = new RandomAccessFile(outputFile, "rw"); // 打开一个随机访问文件流,按读写方式
long fileLength = randomFile.length(); // 文件长度,字节数
randomFile.seek(fileLength); // 将写文件指针移到文件尾
randomFile.writeBytes(msgs);
randomFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void append4(String outputFile, String msgs) {
try {
mbb.position(pos) ;
mbb.put(msgs.getBytes());
pos = pos + msgs.getBytes().length ;
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
static RandomAccessFile raf ;
static MappedByteBuffer mbb ;
static Integer pos = 0 ;
}
加入-XX::+PrintGC, 打印的结果是:
[GC 32704K->2928K(124992K), 0.0024320 secs]
[GC 35632K->5200K(124992K), 0.0020096 secs]
[GC 29268K->5200K(124992K), 0.0014802 secs]
[GC 37904K->9792K(157696K), 0.0035590 secs]
[GC 60504K->9840K(157696K), 0.0008594 secs]
[GC 75248K->28224K(224640K), 0.0079131 secs]
[GC 159040K->30572K(224768K), 0.0014706 secs]
[GC 159705K->37516K(355008K), 0.0029869 secs]
[GC 299148K->46668K(355008K), 0.0031385 secs]
[GC 308300K->48980K(511296K), 0.0010842 secs]
[GC 467604K->55860K(511616K), 0.0036752 secs]
可以看到一共产生了11次GC, 而让我困惑的是,使用jstat -gcutil 18360 20 200 > 2.txt
结果如下:
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 0.00 12.01 0.00 11.93 0 0.000 0 0.000 0.000
0.00 0.00 12.01 0.00 11.93 0 0.000 0 0.000 0.000
0.00 54.32 5.86 0.01 11.94 1 0.002 0 0.000 0.002
0.00 54.32 5.86 0.01 11.94 1 0.002 0 0.000 0.002
96.58 0.00 0.00 0.01 11.94 2 0.004 0 0.000 0.004
96.58 0.00 21.54 0.01 11.94 2 0.004 0 0.000 0.004
0.00 96.58 0.00 0.01 11.94 3 0.006 0 0.000 0.006
0.00 96.58 82.32 0.01 11.94 3 0.006 0 0.000 0.006
10.57 0.00 0.00 10.61 11.94 4 0.009 0 0.000 0.009
10.57 0.00 0.00 10.61 11.94 4 0.009 0 0.000 0.009
10.57 0.00 41.35 10.61 11.94 4 0.009 0 0.000 0.009
10.57 0.00 41.35 10.61 11.94 4 0.009 0 0.000 0.009
0.00 11.46 40.92 10.61 11.94 5 0.010 0 0.000 0.010
0.00 11.46 40.92 10.61 11.94 5 0.010 0 0.000 0.010
0.00 11.46 40.92 10.61 11.94 5 0.010 0 0.000 0.010
0.00 11.46 93.70 10.61 11.94 6 0.010 0 0.000 0.010
8.22 0.00 0.00 31.82 11.94 6 0.018 0 0.000 0.018
8.22 0.00 18.62 31.82 11.94 6 0.018 0 0.000 0.018
8.22 0.00 18.62 31.82 11.94 6 0.018 0 0.000 0.018
8.22 0.00 18.62 31.82 11.94 6 0.018 0 0.000 0.018
8.22 0.00 70.07 31.82 12.06 6 0.018 0 0.000 0.018
8.22 0.00 70.07 31.82 12.06 6 0.018 0 0.000 0.018
8.22 0.00 89.85 31.82 12.07 6 0.018 0 0.000 0.018
8.22 0.00 89.85 31.82 12.07 7 0.018 0 0.000 0.018
0.00 34.09 0.00 32.41 12.07 7 0.020 0 0.000 0.020
0.00 34.09 19.26 32.41 12.07 7 0.020 0 0.000 0.020
0.00 34.09 19.26 32.41 12.07 7 0.020 0 0.000 0.020
0.00 34.09 53.07 32.41 12.07 7 0.020 0 0.000 0.020
0.00 34.09 53.07 32.41 12.07 7 0.020 0 0.000 0.020
0.00 34.09 53.07 32.41 12.07 7 0.020 0 0.000 0.020
0.00 34.09 79.83 32.41 12.07 7 0.020 0 0.000 0.020
0.00 34.09 79.83 32.41 12.07 7 0.020 0 0.000 0.020
1.98 0.00 10.34 43.02 12.07 8 0.023 0 0.000 0.023
1.98 0.00 10.34 43.02 12.07 8 0.023 0 0.000 0.023
1.98 0.00 10.34 43.02 12.07 8 0.023 0 0.000 0.023
1.98 0.00 23.53 43.02 12.07 8 0.023 0 0.000 0.023
1.98 0.00 23.53 43.02 12.07 8 0.023 0 0.000 0.023
1.98 0.00 36.71 43.02 12.07 8 0.023 0 0.000 0.023
可以看到只有8次GC.
jstat -gccapacity 18360
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC PGCMN PGCMX PGC PC YGC FGC
43456.0 695616.0 43456.0 5376.0 5376.0 32704.0 86912.0 1391296.0 86912.0 86912.0 21248.0 83968.0 21248.0 21248.0 0 0
这里有两个问题:
1.为啥两个测出的GC次数不一样?
2. 如何计算该JVM生存期内的yongGc回收的内存大小?
求指点。
分享到:
相关推荐
首先:谈谈托管,什么叫托管,我的理解就是托付C#运行环境帮我们去管理,在这个运行环境中可以帮助我们开辟内存和释放内存,开辟内存一般用new,内存是随机分配的,释放主要靠的是GC也就是垃圾回收机制。哪么有两个...
sun_GC回收机制及内存等优化
gc回收机制
第6节: GC垃圾回收-02第6节: GC垃圾回收-02第6节: GC垃圾回收-02第6节: GC垃圾回收-02第6节: GC垃圾回收-02第6节: GC垃圾回收-02第6节: GC垃圾回收-02第6节: GC垃圾回收-02第6节: GC垃圾回收-02第6节: GC...
JVM性能调优-JVM内存整理及GC回收
poi读取大量数据会造成gc内存溢出的报错,由于垃圾回收机制无法将大量的对象及时的回收,而这些对象又会保存在内存中,会导致内存不够用的情况,这时候我们就需要使用新的方法,读取为cvs即可.此解决方案可支持千万数据的...
JVM内存模型、堆与栈详解以及gc回收机制解析、回收方法
JVM性能调优-JVM内存整理及GC回收.pdf
内存的回收机制
java垃圾回收(gc)机制详解
典型的问题包括悬挂指针问题,一个指针引用了一个已经被回收的内存地址,导致程序的运行完全不可知。 另一个典型问题为内存泄露,内存已经分配,但是已经没有了指向该内存的指针,导致内存泄露。 程序员要花费大量...
.net中关于GC垃圾回收机制的详细描述
java查看哪个进程频繁GC垃圾回收
JVM堆相关知识 为什么先说JVM堆? JVM的堆是Java对象的活动空间,程序中的类的对象从中分配空间,其存储着正在...这些对象的建立方式就是那些new一类的操作,当对象无用后,是GC来负责这个无用的对象(地球人都知道)。
JVM GC垃圾回收.pdfJVM GC垃圾回收.pdfJVM GC垃圾回收.pdfJVM GC垃圾回收.pdfJVM GC垃圾回收.pdf
JVM的内存模型,垃圾回收,GC
很好的学习资料,很详细的讲述了JVM性能调优,JVM内存模型,垃圾回收原理算法等等,很适合JAVA程序员阅读。
GC总结