![]() |
1
6
我会说,不要创建一个包含所有数据的巨大的bytebuffer。创建一个小得多的bytebuffer,用数据填充它,然后将这些数据写入filechannel。然后重置bytebuffer并继续,直到写入所有数据。 |
![]() |
2
4
检查Java的 Mapped Byte Buffers ,也称为“直接缓冲区”。基本上,这个机制使用操作系统的虚拟内存分页系统将缓冲区直接映射到磁盘。操作系统会神奇地、非常迅速地自动地将字节移动到磁盘和内存中,并且您不必担心更改虚拟机选项。这也将允许您利用Nio改进的性能优于传统的基于Java流的I/O,没有任何奇怪的黑客攻击。 我能想到的只有两种捕获物:
Kirk Pepperdine(一个有点著名的Java性能大师)涉及一个网站,www. javaPrimeCtutuung,它有更多的MB细节: NIO Performance Tips |
![]() |
3
1
如果您访问 随机时尚 (在这里读,跳过,在那里写,向后移动)然后你有问题;-)
但是如果你只写大文件,你应该
认真地
考虑使用流。
流为您提供操作方便 (几乎)任意小内存中任意大的文件 . 在大多数情况下,它们是访问文件系统的首选方式。 |
![]() |
4
0
使用 transferFrom 方法应该有助于实现这一点,假设您以增量方式而不是像前面的答案所指出的那样一次性写入通道。 |
![]() |
5
0
这取决于特定的JDK供应商和版本。 在一些Sun JVM中,GC中有一个bug。直接内存不足不会触发主堆中的GC,但直接内存由主堆中的垃圾直接字节缓冲区固定。如果主堆大部分是空的,那么它们在很长一段时间内不会被收集。 即使您自己不使用直接缓冲区,这也可能会让您头疼,因为JVM可能会代表您创建直接缓冲区。例如,将非直接的bytebuffer写入socketchannel会在封面下创建一个直接缓冲区,用于实际的I/O操作。 解决方法是自己使用少量的直接缓冲区,并保留它们以供重用。 |
![]() |
6
0
前两种回答似乎很合理。至于命令行开关是否工作,这取决于内存使用达到限制的速度。如果您没有足够的RAM和虚拟内存,可用内存至少是可用内存的三倍,那么您需要使用给出的备选建议之一。 |
![]() |
RobA · 在Java AWS SDK中解密数据密钥会产生乱码 7 年前 |
![]() |
committedandroider · 为什么我的位集大小为0? 7 年前 |
![]() |
Robin-Hoodie · 在自定义TG2480H打印机上打印徽标 7 年前 |
![]() |
TychoTheTaco · 从ByteBuffer获取IP数据包数据 8 年前 |
![]() |
elect · 在视图缓冲区中添加浮点数组不会增加位置是正常的吗? 9 年前 |