最近在查一个内存泄露问题的时候查到的,总所周知-XX:MaxDirectMemorySize可以设置java堆外内存的峰值,但是具体是在哪里限制的呢
java.nio.DirectByteBuffer用于生成一块cap大小的堆外内存
java.nio.Bits
// These methods should be called whenever direct memory is allocated or // freed. They allow the user to control the amount of direct memory // which a process may access. All sizes are specified in bytes. static void reserveMemory(long size, int cap) { synchronized (Bits.class) { if (!memoryLimitSet && VM.isBooted()) { maxMemory = VM.maxDirectMemory(); memoryLimitSet = true; } // -XX:MaxDirectMemorySize limits the total capacity rather than the // actual memory usage, which will differ when buffers are page // aligned. if (cap <= maxMemory - totalCapacity) { //这里操作了totalCapacity,注意是加锁的哦 reservedMemory += size; totalCapacity += cap; count++; return; } } System.gc(); try { Thread.sleep(100);//其实jvm也用了很low的sleep下么 } catch (InterruptedException x) { // Restore interrupt status Thread.currentThread().interrupt(); } synchronized (Bits.class) { if (totalCapacity + cap > maxMemory) //这里超过就异常了 throw new OutOfMemoryError("Direct buffer memory"); reservedMemory += size; totalCapacity += cap; count++; } }
补充一下,计算totalCapacity的时候加了同步锁,所以申请堆外内存的时候也限制了服务性能。
相关推荐
Java堆外内存泄露场景总结,包含几个常用的可能,如:JNI,NIO,AWT/Swing,Inflater&Deflater;
堆外内存,也被称为直接内存(Direct Memory),是指不在JVM的堆内存中分配的内存,而是直接在操作系统的本地内存中进行分配。这样可以避免Java对象创建时的额外开销,例如垃圾收集的检查和内存分配的慢速。 1. **...
总的来说,Java堆外内存是一种高级特性,适用于对性能有极高要求的应用场景。但同时也需要开发者具备一定的内存管理知识,以确保程序的正确性和效率。理解和合理使用堆外内存,能够显著提升Java应用程序的性能,尤其...
### Java中堆内存与栈内存分配浅析 #### 一、引言 在Java编程语言中,内存管理是一项至关重要的技术。程序运行时所使用的内存主要分为两类:堆内存(Heap Memory)和栈内存(Stack Memory)。理解这两种内存类型的...
这个视频指导我们java开发遇到堆内存使用正常、gc正常,但实际使用的物理内存缺非常高,特别是容器化部署很容易因内存使用超limit限制导致pod重启,怀疑堆外内存泄露?如何排查堆外内存的使用情况,这个视频详细讲解...
### Java中堆内存和栈内存详解 #### 一、引言 在Java编程语言中,内存管理是一项核心技能。为了更好地理解和使用Java,必须清楚地了解堆内存与栈内存的区别及其工作原理。本文将深入探讨Java中堆内存与栈内存的概念...
以下是五个关键技巧,可以帮助你有效地调整Java堆内存设置: 1. **理解默认值与自定义配置**:每个JVM都有默认的堆内存大小,但这个默认值可能并不适合所有应用。你可以通过JVM启动参数-Xms和-Xmx来分别设置初始堆...
本文将重点讨论堆内存的设置与管理。 #### 一、堆内存(Heap) 堆内存是JVM用来存储对象实例和数组的地方,它是JVM管理的最大块内存区域。堆内存可以被细分为三个主要区域:新生代(Young Generation)、老年代...
近经常有人问我在Java中使用堆外(off heap)内存的好处与用途何在。我想其他面临几样选择的人应该也会对这个答案感兴趣吧。 堆外内存其实并无特别之处。线程栈,应用程序代码,NIO缓存用的都是堆外内存。事实上...
浅谈Java堆外内存之突破JVM枷锁 本文主要介绍了Java堆外内存的概念,包括JVM内存分配、JVM垃圾回收、堆外内存的垃圾回收等相关内容。Java开发者都知道,Java中不需要手动申请和释放内存,JVM会自动进行垃圾回收;而...
总之,Java堆外内存技术是提高应用程序性能的一个重要工具,但同时也需要谨慎使用和管理,以确保系统的稳定性和高效性。熟悉DirectByteBuffer的工作原理和生命周期管理,对于Java开发者来说,是提升技术水平和解决...
在Java编程环境中,JVM(Java虚拟机)为我们提供了自动内存管理,主要分为堆内存(Heap)和栈内存(Stack)。然而,对于某些特定场景,如大数据处理、高并发应用或者处理大对象时,JVM堆内存的限制可能成为性能瓶颈...
Java堆内存是Java虚拟机(JVM)中最大的一块内存区域,主要用于存储对象实例和数组。理解堆内存的划分、分配机制和垃圾回收过程对于Java开发者来说至关重要,因为这些知识可以帮助他们优化应用程序的性能,避免内存...
`Slice`库是一个专为Java设计的工具,其主要目标是提供对堆内存和堆外内存的有效管理。堆外内存,也称为直接内存或本地内存,是指不通过Java虚拟机堆分配的内存,它绕过了Java垃圾收集机制,能提供更快的访问速度,...
jdk 内存设置是 Java 开发中非常重要的一部分。它直接影响着 Java 应用程序的性能和稳定性。jdk 内存设置主要包括堆大小设置、垃圾收集器的选择和配置等几个方面。 堆大小设置是 jdk 内存设置的核心内容。堆大小的...
【标题】:深入理解Java内存使用与优化:从代码到Java堆 【描述】:本文旨在帮助Java开发者深入了解从编写代码到Java堆的内存管理过程,以便更好地优化应用程序的内存使用。通过分析Java代码中的内存开销,以及讨论...
Java中栈内存和堆内存详解,非常容易理解