`

JAVA堆外内存设置

 
阅读更多

最近在查一个内存泄露问题的时候查到的,总所周知-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的时候加了同步锁,所以申请堆外内存的时候也限制了服务性能。

 

 

  • 大小: 145.9 KB
  • 大小: 134.2 KB
分享到:
评论

相关推荐

    Java堆外内存泄露场景总结.pdf

    Java堆外内存泄露场景总结,包含几个常用的可能,如:JNI,NIO,AWT/Swing,Inflater&Deflater;

    Java堆外内存的使用Java开发Java经验技巧共5页

    堆外内存,也被称为直接内存(Direct Memory),是指不在JVM的堆内存中分配的内存,而是直接在操作系统的本地内存中进行分配。这样可以避免Java对象创建时的额外开销,例如垃圾收集的检查和内存分配的慢速。 1. **...

    深入解读 Java 堆外内存(直接内存)1

    总的来说,Java堆外内存是一种高级特性,适用于对性能有极高要求的应用场景。但同时也需要开发者具备一定的内存管理知识,以确保程序的正确性和效率。理解和合理使用堆外内存,能够显著提升Java应用程序的性能,尤其...

    Java中堆内存与栈内存分配浅析

    ### Java中堆内存与栈内存分配浅析 #### 一、引言 在Java编程语言中,内存管理是一项至关重要的技术。程序运行时所使用的内存主要分为两类:堆内存(Heap Memory)和栈内存(Stack Memory)。理解这两种内存类型的...

    Java堆外内存使用分析详细

    这个视频指导我们java开发遇到堆内存使用正常、gc正常,但实际使用的物理内存缺非常高,特别是容器化部署很容易因内存使用超limit限制导致pod重启,怀疑堆外内存泄露?如何排查堆外内存的使用情况,这个视频详细讲解...

    Java中堆内存和栈内存详解

    ### Java中堆内存和栈内存详解 #### 一、引言 在Java编程语言中,内存管理是一项核心技能。为了更好地理解和使用Java,必须清楚地了解堆内存与栈内存的区别及其工作原理。本文将深入探讨Java中堆内存与栈内存的概念...

    优化Java堆内存大小的五个技巧

    以下是五个关键技巧,可以帮助你有效地调整Java堆内存设置: 1. **理解默认值与自定义配置**:每个JVM都有默认的堆内存大小,但这个默认值可能并不适合所有应用。你可以通过JVM启动参数-Xms和-Xmx来分别设置初始堆...

    JAVA 内存设置原理

    本文将重点讨论堆内存的设置与管理。 #### 一、堆内存(Heap) 堆内存是JVM用来存储对象实例和数组的地方,它是JVM管理的最大块内存区域。堆内存可以被细分为三个主要区域:新生代(Young Generation)、老年代...

    Java堆外内存的使用

    近经常有人问我在Java中使用堆外(off heap)内存的好处与用途何在。我想其他面临几样选择的人应该也会对这个答案感兴趣吧。  堆外内存其实并无特别之处。线程栈,应用程序代码,NIO缓存用的都是堆外内存。事实上...

    浅谈Java堆外内存之突破JVM枷锁

    浅谈Java堆外内存之突破JVM枷锁 本文主要介绍了Java堆外内存的概念,包括JVM内存分配、JVM垃圾回收、堆外内存的垃圾回收等相关内容。Java开发者都知道,Java中不需要手动申请和释放内存,JVM会自动进行垃圾回收;而...

    Java开发者必须了解的堆外内存技术.docx

    总之,Java堆外内存技术是提高应用程序性能的一个重要工具,但同时也需要谨慎使用和管理,以确保系统的稳定性和高效性。熟悉DirectByteBuffer的工作原理和生命周期管理,对于Java开发者来说,是提升技术水平和解决...

    堆外内存部分代码

    在Java编程环境中,JVM(Java虚拟机)为我们提供了自动内存管理,主要分为堆内存(Heap)和栈内存(Stack)。然而,对于某些特定场景,如大数据处理、高并发应用或者处理大对象时,JVM堆内存的限制可能成为性能瓶颈...

    Java堆内存管理:深入解析与代码实践

    Java堆内存是Java虚拟机(JVM)中最大的一块内存区域,主要用于存储对象实例和数组。理解堆内存的划分、分配机制和垃圾回收过程对于Java开发者来说至关重要,因为这些知识可以帮助他们优化应用程序的性能,避免内存...

    slice:Java库,可有效处理堆内存和堆外内存

    `Slice`库是一个专为Java设计的工具,其主要目标是提供对堆内存和堆外内存的有效管理。堆外内存,也称为直接内存或本地内存,是指不通过Java虚拟机堆分配的内存,它绕过了Java垃圾收集机制,能提供更快的访问速度,...

    jdk 内存设置jdk内存设置

    jdk 内存设置是 Java 开发中非常重要的一部分。它直接影响着 Java 应用程序的性能和稳定性。jdk 内存设置主要包括堆大小设置、垃圾收集器的选择和配置等几个方面。 堆大小设置是 jdk 内存设置的核心内容。堆大小的...

    从 Java 代码到 Java 堆 理解和优化您的应用程序的内存使用

    【标题】:深入理解Java内存使用与优化:从代码到Java堆 【描述】:本文旨在帮助Java开发者深入了解从编写代码到Java堆的内存管理过程,以便更好地优化应用程序的内存使用。通过分析Java代码中的内存开销,以及讨论...

    Java中栈内存和堆内存详解

    Java中栈内存和堆内存详解,非常容易理解

Global site tag (gtag.js) - Google Analytics