首页 / 知识
关于java:使用Bytebuffers和NIO时如何避免OutOfMemoryError?
2023-04-13 06:35:00

How to avoid OutOfMemoryError when using Bytebuffers and NIO?我正在使用 jvm 选项 我想说不要一次创建一个包含所有数据的巨大 ByteBuffer。创建一个小得多的 ByteBuffer,用数据填充它,然后将这些数据写入 FileChannel。然后重置 ByteBuffer 并继续,直到所有数据都被写入。 查看 Java 的映射字节缓冲区,也称为"直接缓冲区"。基本上,这种机制使用操作系统的虚拟内存分页系统将缓冲区直接"映射"到磁盘。操作系统将自动神奇地管理将字节移入/移出磁盘和内存,非常快速,您不必担心更改虚拟机选项。这也将允许您利用 NIO 比传统的基于 java 流的 i/o 改进的性能,而无需任何奇怪的 hack。 我能想到的唯一两个问题是: Kirk Pepperdine(有点著名的 Java 性能大师)参与了一个网站 www.JavaPerformanceTuning.com,该网站有更多 MBB 详细信息:NIO 性能提示 如果您以随机方式访问文件(在此处阅读、跳过、在此处写入、后退),那么您就有问题了 ;-) 但是如果你只写大文件,你应该认真考虑使用流。 流为您提供了在(几乎)任意小的内存中操作任意大文件的便利。在绝大多数情况下,它们是访问文件系统的首选方式。 这取决于特定的 JDK vendor和版本。 在某些 Sun JVM 中存在 GC 错误。直接内存不足不会触发主堆中的 GC,但直接内存被主堆中的垃圾直接 ByteBuffers 固定。如果主堆大部分是空的,那么它们很长一段时间都不会被收集。 即使您自己不使用直接缓冲区,这也会烧毁您,因为 JVM 可能会代表您创建直接缓冲区。例如,将非直接 ByteBuffer 写入 SocketChannel 会在后台创建一个直接缓冲区以用于实际的 I/O 操作。 解决方法是自己使用少量直接缓冲区,并保留它们以供重复使用。 使用 transferFrom 方法应该对此有所帮助,假设您以增量方式写入通道,而不是像之前的答案所指出的那样一次全部写入。 前两个回答似乎很合理。至于命令行开关是否会起作用,这取决于您的内存使用量达到限制的速度。如果您没有足够的可用内存和虚拟内存来至少将可用内存增加三倍,那么您将需要使用给出的替代建议之一。 |
最新内容
相关内容
Python元类之通过元类实现数据库OR
Python元类之通过元类实现数据库ORM框架,数据,名称,信息,代码,主体,当中,字段,分析,一致,投入,ORM框架是什么如果是没有做过后端的小伙伴上来python如何导入txt数据库?
python如何导入txt数据库?,数据,时间,代码,培训,数据库,函数,读数,数据表,以上,方法,python将TXT数据导入数据库的方法代码如下:#!/usr/bin/pypython怎样获取json数据类型?
python怎样获取json数据类型?,培训,数据类型,类型,正则,火狐,以上,方法,更多,内容,列表,python中获取json不同数据类型的方法:1、获取"key":vpython数据怎么添加列?
python数据怎么添加列?,数据,位置,培训,方法,属性,结果,示例,函数,前面,以上,python在DataFrame数据中添加列的方法:1、使用concat方法在数据python如何获取列表里的数据类型?
python如何获取列表里的数据类型?,代码,信息,培训,类型,数据类型,表里,元素,语句,函数,对象,1、Python可以通过tpye()方法来判断list里的元知python怎么读sql数据?
python怎么读sql数据?,数据,培训,游标,格式,字典,方式,语句,参数,结构,对象,python中读取SQL数据的方法:python中可以使用游标cursor来读取SQL实数是不是python的数据类型?
实数是不是python的数据类型?,数字,标准,培训,实数,数据类型,数轴,复数,有限小数,无理数,虚数,实数是python的数据类型。实数,是有理数和无理python怎么筛选列表中大于0的数据?
python怎么筛选列表中大于0的数据?,数据,培训,函数,结果,以上,方法,更多,内容,列表,python筛选列表中大于0的数据的方法:1、使用匿名函数lambpython字典类型的数据怎么保存
python字典类型的数据怎么保存,数据,培训,字典,中间,类型,文件,相似性,变量,算法,效率,在使用python编程过程中,我们往往需要借助字典来提高编python怎么创建mysql数据库连接
python怎么创建mysql数据库连接,项目,数据,培训,参数,结果,数据库,方法,语句,数据库连接,接口,python数据库接口支持非常多的数据库,你可以选如何用python将数据导出
如何用python将数据导出,数据,情况,分析,代码,培训,文件,表格,难事,后面,以上,Python的一大应用就是数据分析了,而数据分析中,经常碰到需要处理如何用python处理数据
如何用python处理数据,数据,培训,类型,数值,模块,字段,利器,以上,案例,格式,python处理数据利器→Pandas数据一般格式:csv/xlsx如何用pandas读