这是我的想法:
- JVM 将字符串从文件系统复制到主内存中。
- JVM 将字符串从主内存复制到 Java 堆中。
- 用它。
我对吗?我的意思是,实际上有两步复制。
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)。
对于大多数事情,您无需担心所有的复制。缓冲区很小,开销也很小。
抢
当 Java 程序启动时,Java 虚拟机从操作系统中获取一些内存。
Java 虚拟机或 JVM 使用此内存来满足其所有需求,并且此内存的一部分称为 java 堆内存。
Java中的堆一般位于地址空间的底部并向上移动。
每当我们使用 new 运算符或通过任何其他方式创建对象时,都会从堆中为对象分配内存,当对象死亡或垃圾收集时,内存会回到 Java 中的堆空间。
Java 堆可能位于主内存 (RAM) 中,也可能位于磁盘中,或两者兼有,具体取决于您的操作系统配置。