0

这是我的想法:

  1. JVM 将字符串从文件系统复制到主内存中。
  2. JVM 将字符串从主内存复制到 Java 堆中。
  3. 用它。

我对吗?我的意思是,实际上有两步复制。

4

2 回答 2

1

vea 可能超过 2 个副本。很大程度上取决于你的阅读方式。

考虑包装在 BufferedReader 中的 FileReader 的常见情况。

当您调用 BufferedReader.readLine() 时,您会得到三个副本。

1) BufferedReader 为空(开始),因此它在 FileReader 上调用 read(char[])。

2) FileReader(在 JVM 的 C 层)对 uint8[] 缓冲区进行 read() 系统调用。(副本 1)

3) 最佳情况 FileReader 然后转换 unit8[] 内容并将结果复制到 BufferedReader 提供的 char[] 中(副本 2)。(请注意,即使我们有一个 InputStreams 并且结果是一个 byte[] 而不是一个字符串,这个副本仍然存在。)

4) readLine() 然后将 char[] 复制到行尾到一个字符串中。(副本 3)。

对于大多数事情,您无需担心所有的复制。缓冲区很小,开销也很小。

于 2013-06-26T03:43:30.040 回答
0

当 Java 程序启动时,Java 虚拟机从操作系统中获取一些内存。

Java 虚拟机或 JVM 使用此内存来满足其所有需求,并且此内存的一部分称为 java 堆内存。

Java中的堆一般位于地址空间的底部并向上移动。

每当我们使用 new 运算符或通过任何其他方式创建对象时,都会从堆中为对象分配内存,当对象死亡或垃圾收集时,内存会回到 Java 中的堆空间。

Java 堆可能位于主内存 (RAM) 中,也可能位于磁盘中,或两者兼有,具体取决于您的操作系统配置。

于 2013-06-26T03:51:54.510 回答