0

我想知道JVM是否对硬盘写入/读取有影响?

我知道 JVM 可以控制为进程分配的堆内存。例如,在 shell 中,我这样做是为了设置分配的堆内存:

java -Xms512M -Xmx1024M -jar my_java_program.jar

那么,是否可以在硬盘(IO)上设置最大或最小写入/读取速度?

感谢

编辑 :

我已经完成了一个不断写入文本文件的 java 程序。我的程序具有以下架构:

public class Generator {
    public static void main(String[] args) throws Exception {

         // Variables initialization ...

         // Loading in RAM some data to generate my text files

         while(true){

               // Writing the file
               BufferedOutputStream buff = new BufferedOutputStream(new FileOutputStream(new File(temporaryFolderPath, fileName)), 51200000);
               buff.write((some stuff ...).getBytes());
               buff.flush();
               buff.close();
         }
    }
}

我生成该程序的可执行 JAR,并在具有 8 个 CPU 的虚拟机上执行它。我的目的是看这个程序的写入速度,所以我使用了iostat命令来检查IO磁盘传输。

一个实例的结果:

wsec/s : 大约 8000

with wsec/s :每秒写入硬盘的扇区数(不知道一个扇区的大小)

结果有 2 个实例:

wsec/s : 大约 16000

结果有 3 个实例:

毫秒/秒:32000

我的问题 :

为什么当我多次执行我的 java 程序实例时,我的写作速度会更快?或者什么可以限制一个实例的写入速度?

4

1 回答 1

3

不,每当您使用任何从磁盘读取/写入的 Java 库时,Java 基本上都是在要求 O/S 尽可能快地传递数据。

如果您遇到 I/O 缓慢的问题,那么一个常见的问题是忘记在 Java 级别缓冲数据。因此,例如,通常您应该避免直接使用 FileInputStream,而是将 BufferedInputStream 包裹在它周围。缓冲区大小会影响读/写速度(例如,请参见读取时间与缓冲区大小的图表),但通常默认缓冲区大小是好的:您需要做的是首先记住要缓冲。

除此之外,为了给出更令人满意的答案,我们真的需要看看你在什么情况下的 I/O 性能。

于 2013-08-08T17:25:29.760 回答