- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我刚刚在我的 opensrc 库代码中遇到了一个错误,该错误分配了一个大缓冲区来修改一个大的 flac 文件,该错误只发生在使用 Java 1.8.0_74 25.74-b02 32bit 的具有 3Gb 内存的旧 PC 机器上
原来我只是分配一个缓冲区
ByteBuffer audioData = ByteBuffer.allocateDirect((int)(fc.size() - fc.position()));
MappedByteBuffer mappedFile = fc.map(MapMode.READ_WRITE, 0, totalTargetSize);
最佳答案
尽管映射缓冲区在任何时间点都可能使用较少的物理内存,但它仍然需要一个等于缓冲区总(逻辑)大小的可用(逻辑)地址空间。更糟糕的是,它可能(可能)要求地址空间是连续的。无论出于何种原因,那台旧计算机似乎无法提供足够的额外逻辑地址空间。两种可能的解释是 (1) 有限的逻辑地址空间 + 大量缓冲内存要求,以及 (2) 操作系统对可映射为 I/O 文件的内存量施加的一些内部限制。
关于第一种可能性,请考虑这样一个事实,即在虚拟内存系统中,每个进程都在其自己的逻辑地址空间中执行(因此可以访问完整的 2^32 字节寻址空间)。因此,如果--在您尝试实例化 MappedByteBuffer
的时间点--JVM 进程的当前大小加上 MappedByteBuffer
的总(逻辑)大小|大于 2^32 字节(~ 4 GB),那么你会遇到 OutOfMemoryError
(或该类选择抛出的任何错误/异常,例如 IOException: Map failed
)。
关于第二种可能性,评估这一点的最简单方法可能是在您尝试实例化 MappedByteBuffer
时分析您的程序/JVM。 .如果JVM进程分配的内存+所需的totalTargetSize
远低于 2^32 字节上限,但您仍然收到“映射失败”错误,那么可能是操作系统对内存映射文件大小的某些内部限制是根本原因。
那么这意味着什么尽可能的解决方案呢?
MappedByteBuffer
的生命周期内都具有尽可能低的内存占用。 . (看似合理,但可能不相关且绝对不切实际)totalTargetSize
究竟是什么?对于您的问题案例?
MappedByteBuffer
,即使文件本身小于 2^32 字节,也会发生这种情况。请求 (
see comments )。需要明确的是,仍然可以抛出 IOE 而不是 OOM
even if the original cause is ENOMEM .此外,特别是旧的 [在此处插入 Microsoft 操作系统] 32 位环境(
example 、
example )似乎存在问题。
MappedFileBuffer
出于性能原因,但也以较小的块对文件进行操作,以解决地址空间限制。 MappedFileBuffer
的原因在较小的块中作为第三个是因为在取消映射
MappedFileBuffer
时存在完善且 Unresolved 问题。 (
example ),这是您在处理每个块之间必须要做的事情,以避免由于累积映射的组合地址空间占用而达到 32 位上限。
(注意:这仅适用于 32 位地址空间上限而不是一些内部操作系统限制的问题......如果是后者,则忽略此段)您可以尝试
this strategy (删除所有引用,然后运行 GC),但您基本上会受制于 GC 和您的底层操作系统如何在内存映射文件方面进行交互。其他试图或多或少直接操作底层内存映射文件 (
example ) 的潜在解决方法非常危险,并且受到 Oracle (
see last paragraph ) 的特别谴责。最后,考虑到 GC 行为无论如何都是不可靠的,而且官方文档明确指出“
many of the details of memory-mapped files [are] unspecified”,我会
不是 推荐使用
MappedFileBuffer
无论您可能读到什么解决方法,都像这样。
关于java - 在内存有限的系统上写入大文件时,如何避免 mapFailed() 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40545683/
我们已经有一个使用 AnyEvent 的库。它在内部使用 AnyEvent,并最终返回一个值(同步 - 不使用回调)。有什么方法可以将这个库与 Mojolicious 一起使用吗? 它的作用如下: #
我想从 XSD 文件生成带有 JAXB 的 Java 类。 问题是,我总是得到一些像这样的类(删除了命名空间): public static class Action { @X
我有一个关于 html 输入标签或 primefaces p:input 的问题。为什么光标总是自动跳转到输入字段。我的页面高度很高,因此您需要向下滚动。输入字段位于页面末尾,光标自动跳转(加载)到页
我今天在考虑面向对象设计,我想知道是否应该避免 if 语句。我的想法是,在任何需要 if 语句的情况下,您都可以简单地创建两个实现相同方法的对象。这两个方法实现只是原始 if 语句的两个可能的分支。
String graphNameUsed = graphName.getName(); if (graphType.equals("All") || graphType.equals(
我有一张友谊 table CREATE TABLE IF NOT EXISTS `friendList` ( `id` int(10) NOT NULL, `id_friend` int(10
上下文 Debian 64。Core 2 二人组。 摆弄循环。我使用了同一循环的不同变体,但我希望尽可能避免条件分支。 但是,即使我认为它也很难被击败。 我考虑过 SSE 或位移位,但它仍然需要跳转(
我最近在 Java 中创建了一个方法来获取字符串的排列,但是当字符串太长时它会抛出这个错误:java.lang.OutOfMemoryError: Java heap space我确信该方法是有效的,
我正在使用 (C++) 库,其中需要使用流初始化对象。库提供的示例代码使用此代码: // Declare the input stream HfstInputStream *in = NULL; tr
我有一个 SQL 查询,我在 WHERE 子句中使用子查询。然后我需要再次使用相同的子查询将其与不同的列进行比较。 我假设没有办法在子查询之外访问“emp_education_list li”? 我猜
我了解到在 GUI 线程上不允许进行网络操作。对我来说还可以。但是为什么在 Dialog 按钮点击回调上使用这段代码仍然会产生 NetworkOnMainThreadException ? new T
有没有办法避免在函数重定向中使用 if 和硬编码字符串,想法是接收一个字符串并调用适当的函数,可能使用模板/元编程.. #include #include void account() {
我正在尝试避免客户端出现 TIME_WAIT。我连接然后设置 O_NONBLOCK 和 SO_REUSEADDR。我调用 read 直到它返回 0。当 read 返回 0 时,errno 也为 0。我
我正在开发 C++ Qt 应用程序。为了在应用程序或其连接的设备出现故障时帮助用户,程序导出所有内部设置并将它们存储在一个普通文件(目前为 csv)中。然后将此文件发送到公司(例如通过邮件)。 为避免
我有一组具有公共(public)父类(super class)的 POJO。这些存储在 superclass 类型的二维数组中。现在,我想从数组中获取一个对象并使用子类 的方法。这意味着我必须将它们转
在我的代码中,当 List 为 null 时,我通常使用这种方法来避免 for 语句中的 NullPointerException: if (myList != null && myList.size
我正在尝试避免客户端出现 TIME_WAIT。我连接然后设置 O_NONBLOCK 和 SO_REUSEADDR。我调用 read 直到它返回 0。当 read 返回 0 时,errno 也为 0。我
在不支持异常的语言和/或库中,许多/几乎所有函数都会返回一个值,指示其操作成功或失败 - 最著名的例子可能是 UN*X 系统调用,例如 open( ) 或 chdir(),或一些 libc 函数。 无
我尝试按值提取行。 col1 df$col1[col1 == "A"] [1] "A" NA 当然我只想要“A”。如何避免 R 选择 NA 值?顺便说一句,我认为这种行为非常危险,因为很多人都会陷入
我想将两个向量合并到一个数据集中,并将其与函数 mutate 集成为 5 个新列到现有数据集中。这是我的示例代码: vector1% rowwise()%>% mutate(vector2|>
我是一名优秀的程序员,十分优秀!