当前位置:首页 > 内存 > 正文

jvm堆外内存过高

  • 内存
  • 2024-06-04 21:37:41
  • 4068

一、Java养成什么样的编程习惯可以有利于GC作者:RednaxelaFX
链接:


二、SparkonYarn为什么出现内存超界container被kill一个Executor对应一个JVM进程。从Spark的角度来看,Executor占用的内存分为两部分:ExecutorMemory和MemoryOverhead。其中,ExecutorMemory是JVM进程的Java堆区域,MemoryOverhead是JVM进程除了Java堆之外占用的空间,包括方法区(永久代)、Java虚拟机栈、本地方法JVM进程本身使用的栈、内存和堆外部内存(DirectMemory)等
和分别定义Sparkdriver和executor的ExecutorMemory。
Overhead和Overhead分别设置Sparkdriver和executor的MemoryOverhead。
此外,Spark会分配大量的堆外内存。默认最大堆外内存可以与您可以使用的ExecutorMemory相同。MaxDirectMemorySize通过javaOptions配置最大值。
堆外内存的最大大小可以与ExecutorMemory相同,但是堆外内存的大小受到MemoryOverhead的限制。因此,当MaxDirectMemorySize、ExecutorMemory和MemoryOverhead设置不合理时,容器内存可能会超出限制,被Yarn杀死。
例如,ExecutorMemory为8GB,MemoryOverhead为4GB,MaxDirectMemorySize未定义。目前,Yarn估计一个容器最多可以使用12GB内存,但只有最大堆外内存可以这样做。为8G,这导致容器最多可以使用超过16G。内存(堆内内存+堆外内存)大于12G,最终被Yarn杀死。
合理的调优规则为:ExecutorMemory+MemoryOverhead>ExecutorMemory+MaxDirectMemorySize
因此Spark应用占用的集群内存总大小为:
参数设置建议:
每个Executor进程的内存设置为4G~8G比较合适。
每个执行器的CPU核数设置在2到4之间比较合适。
以下是一些推荐的参数设置:


三、offheap是指哪种内存

offheap是指堆外内存。

Java虚拟机(JVM)是​​将Java代码转换为可执行代码的虚拟机。JVM内存管理是Java语言的优点之一,它自动管理内存,使程序员不必担心手动分配和释放内存。然而,随着应用程序变得更加复杂和庞大,Java堆内存的局限性变得更加明显。

为了解决这个问题,一些开发人员开始使用堆外内存。Offheap是指在Java虚拟机堆之外分配的内存。在Java虚拟机中,堆内存是Java对象的存储区域,而堆外内存是Java虚拟机之外的内存区域。可以通过JavaNativeInterface访问堆外内存。

堆外内存的优点

Java堆内存大小取决于JVM配置和物理内存大小。如果应用程序需要更多内存,则需要增加JVM堆内存大小。但是,这可能会导致JVM崩溃或降低性能。使用Offheap内存可以避免这种情况。在Java堆内存中,Java对象是通过垃圾收集器进行管理的。

当一个Java对象不再被引用时,垃圾收集器会自动释放它所占用的内存。这个过程需要很多时间。使用Offheap内存可以避免这个问题。Offheap内存中的数据不会被垃圾收集器管理,因此可以获得更快的内存访问速度。