我一直在阅读有关Linux内存不足的情况,手册页中的以下段落让我开始思考:
默认情况下,Linux遵循乐观的内存分配策略。这意味着当malloc()返回非NULL时,不能保证内存确实可用。这是一个非常糟糕的错误。万一发现系统内存不足,一个臭名昭著的OOM杀手将杀死一个或多个进程。[…]
考虑到操作员的new实现最终会在某个时刻调用malloc,是否可以保证new实际上会在Linux上抛出?如果没有,如何处理这种显然无法检测到的错误情况?
这取决于; 您可以使用vm.overcommit_memory
配置内核的过量使用设置。
赫伯·萨特(Herb
Sutter)几年前讨论了这种行为实际上是如何不符合C
++标准的
:
“在某些操作系统上,尤其是Linux,内存分配总是会成功。停止。即使在请求的内存确实不可用的情况下,分配也总是能够成功吗?原因是分配本身仅记录了对内存的请求;内存分配只是记录了对内存的请求。因此,在实际使用内存之前,(物理或虚拟)内存不会真正通过实际的后备存储提交给请求过程。
“请注意,如果new直接使用操作系统的功能,那么new总是会成功,但是以后任何无辜的代码(例如buf [100]
=’c’;都可能抛出,失败或停止。从标准C 的角度来看,这两种效果都一样)是不符合标准的,因为C
标准要求如果new无法提交足够的内存,它必须失败(这不会失败),并且buf [100] =’c’之类的代码不应引发异常或否则失败(这威力)。”
这只是出于好奇。 如果是这样,那么扩展到一个极端的情况,如果您的内存以某种方式结束了超级碎片(例如,每隔一个字节都被分配为ala 我想站台不重要? 很抱歉提出了一个扩展的问题,但这也会发生在其他语言中吗,比如Java/C#?
如果内存不足,我必须抛出异常。我真的不是专家。用这个方法怎么做?
最近,在运行我们的应用程序时,我们遇到了内存溢出异常。 这是异常发生之前的堆转储 看起来老根差不多吃饱了(76%)。我假设当它最终达到100%时,OOM就会发生。然而,看起来eden只有13%。 有人能解释为什么即使年轻一代还有一些空间,OOM也会发生吗?
我继承了以下java代码,它从获取
众所周知,有两种锁定策略:乐观锁定和悲观锁定 悲观锁定是锁定记录供您独占使用,直到您使用完它。它比乐观锁定具有更好的完整性,但是需要您小心应用程序设计以避免死锁。 也知道,乐观并发控制与多版本并发控制(Oracle或MSSQL-Snapshot/MVCC-RC)不同:乐观与多版本并发控制-差异? 但是,如果在两个事务中都使用OCC(乐观并发控制),会在两个交易之间发生死锁吗? 我们可以说乐观锁通过
当我将大数据保存到hdfs时,我正在体验OOME 我在Spark-Submit中使用这个: 当我增加框架时,现在的错误是:Java.lang.outofMemoryError:Java堆空间,所以我必须将驱动程序内存和执行程序内存增加到2G才能工作。如果累加Collection.value.length是500,000,我需要使用3G。这正常吗? 该文件只有146MB,包含200,000行(对于2