程序运行在内存以及IO的体现
首先普及一下常识,如图所示:
1、在整个内存空间中,跑着各种各样的程序,有Java程序、C程序,他们共用一块内存空间。
2、对于Java程序,JVM会申请一块堆空间,通过Xmx可以设置,其余空间是堆外空间,其中每个线程有自己的线程栈,保证线程内存隔离,堆空间使用完以后,会触发Full FC,堆外空间所有进程可共享使用,无限制。
3、所有系统运行的程序都必须通过操作系统内核进行IO操作,操作系统也是程序,也需要一定的内存空间。
一、使用Buffer代替基本IO
我们写一个方法,此方法使用了FileWriter进行了文件的写操作,我们都知道不调用flush()可能会造成数据丢失,那么为什么呢,flush操作到底做了些什么呢?
public void fileIO() throws Exception {
File file = new File("/Volumes/work/temp/temp.txt");
if (file.exists()) {
file.delete();
}
file.createNewFile();
FileInputStream fileInputStream = new FileInputStream(file);
FileWriter fileWriter = new FileWriter(file);
fileWriter.write("hello");
fileWriter.write("world");
fileWriter.write("\nhello world");
Thread.sleep(99999);
fileWriter.flush();
fileWriter.close();
}
我们知道我们在写数据的时候不管是C还是Java都会有两个缓冲区,一个是操作系统的缓冲区sys buffer,还有一个是程序的缓冲区program buffer。那么刚刚的flush操作是把程序的缓冲区内容写到了系统缓冲区,还是把系统缓冲区的内容刷到了硬盘呢?