首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java直接内存与非直接内存性能测试

什么是直接内存与非直接内存 根据官方文档的描述: A byte buffer is either direct or non-direct....(也就是非堆内存);另一种是非直接内存(也就是堆内存)。...对于直接内存来说,JVM将会在IO操作上具有更高的性能,因为它直接作用于本地系统的IO操作。而非直接内存,也就是堆内存中的数据,如果要作IO操作,会先复制到直接内存,再利用本地IO处理。...从数据流的角度,非直接内存是下面这样的作用链: 本地IO-->直接内存-->非直接内存-->直接内存-->本地IO 而直接内存是: 本地IO-->直接内存-->本地IO 很明显,再做IO处理时,比如网络发送大量数据时...在数据量提升时,直接内存相比于非直接内存的申请 有十分十分十分明显的性能问题!

1.4K50

JVM内存模型之直接内存

直接内存 又称堆外内存,也就是说这不是jvm运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域,但这部分也会被频繁的使用,而且也可能导致OOM。 堆外内存有什么优点呢?...1 减少了垃圾回收的工作,因为垃圾回收会暂停其他的工作 2 可以提高性能,避免java堆和native堆(直接内存)来回复制数据。...使用场景 1.在JDK1.4之后加入了NIO,引入了一种基于通道与缓冲区的I/O方式,它可以使用Native库函数直接分配堆外内存,然后通过DirectByteBuffer对象作为这块内存的引用来进行操作...,jvm会自动对这部分的堆外内存进行回收。...2.使用jdk内部未对外公开的unsafe来直接使用堆外内存,但不会被JVM回收 例子 /** * Created by shengjk1 on 2017/8/8 * 会自动回收的 */ //-verbose

67330
您找到你想要的搜索结果了吗?
是的
没有找到

JVM-直接内存

什么是 JVM 直接内存? JVM 直接内存(Direct Memory)是 JVM 运行时使用的一种特殊内存区域,它是 JVM 堆外的一块内存空间。...避免堆内存限制:JVM 直接内存不受 Java 堆大小的限制,可以充分利用系统的物理内存直接 I/O 操作:直接内存的零拷贝特性,可以直接进行 I/O 操作,提高了数据操作效率。...JVM 直接内存的缺点 手动释放内存:JVM 直接内存需要手动释放,如果忘记释放,会导致内存泄漏。...谨慎分配大量直接内存:由于直接内存的分配不受 Java 堆大小的限制,分配过多的直接内存可能导致系统资源的耗尽。 8....它具有高性能、避免堆内存限制和直接 I/O 操作的优点,但需要手动管理内存释放,且内存管理较为复杂。在使用直接内存时,需要注意内存的释放和避免分配过多的直接内存。 本文由 mdnice 多平台发布

40930

JVM内存管理、直接内存和垃圾回收

笔者将按下图分多篇文章详细阐述JVM: 1.jpg 本篇文章主要叙述JVM内存管理、直接内存、垃圾回收和常见的垃圾回收算法: 运行时数据区域 JVM在执行一些基于JVM运行的程序,典型的如Java...然而,当它调用的是本地方法时,虚拟机会保持Java栈不变,不会在线程的Java栈中压入新的栈帧,而是动态连接并直接调用指定的本地方法。 4....但是当创建新创建的对象非常大,该对象会直接进入老年代。 3.png 5....直接内存 直接内存(direct memory)不属于JVM运行时数据区的一部分,属于堆外内存,会被频繁使用,因此在设置各个内存范围时要留出一部分物理内存,否则也容易抛出OutOfMemoryError...标记整理算法 先标记(标记过程与标记清除算法一样),让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。这样可以解决内存碎片问题。 4.

1.5K00

JVM 彻底搞懂JVM内存区域及直接内存

B站搜索“乐哥聊编程“有本篇文章配套视频‍ https://www.bilibili.com/video/BV1rg411v7rw 面试题:直接内存会导致OOM么?...本地方法栈 本地方法栈和虚拟机方法栈作用类似,不过它是为执行native方法服务 堆 堆是被线程共享的一个内存区域,大部分对象都在堆上分配,少部分允许在栈上分配(通过逃逸分析)。...方法区 方法区也是一块内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等。也包括运行时常量池。...jdk8以前主要通过永久代实现方法区 jdk8开始 通过元空间实现方法区 通过本地内存实现 直接内存 直接内存和堆内内存相对应,堆外内存就是把内存对象分配在Java虚拟机的堆以外的内存,这些内存直接受操作系统管理...传统BIO 访问 直接内存访问

75420

Java-直接内存 DirectMemory 详解

Java 直接内存 1. 设计逻辑  下面是 《深入理解 Java 虚拟机 第三版》2.2.7 小节 关于 Java 直接内存的描述。  ...显然,本机直接内存的分配不会受到 Java 堆大小的限制,但是,既然是内存,则肯定还是会受到本机总内存(包括物理内存、SWAP分区或者分页文件)大小以及处理器寻址空间的限制,一般服务器管理员配置虚拟机参数时...堆和 Native 堆(native heap)中来回复制数据,所以在一些场景中显著提高了性能; 直接内存出现 OutOfMemoryError 异常的原因是物理机器的内存是受限的,但是我们通常会忘记需要为直接内存在物理机中预留相关内存空间...之所以 heap 前 native 来修饰,是因为要让其和虚拟机规范中的内存 heap,而现在称呼 directory memory 是因为我们能够直接通过引用访问对象,消除了拷贝操作。  ...); }  其中 nextPutIndex 以及 nextGetIndex 第一参数相当于待放入的基本类型要分为几份 byte 类型,这两个方法主要用于处理加入/拿出基本类型数据是对计数指针的与减

14K20

JVM-直接内存(Direct Memory)

直接内存(Direct Memory) 直接内存是Java堆之外的,直接向系统申请的内存空间,所以直接内存不是虚拟机的一部分,也不是《Java虚拟机规范》中定义的内存区域,也有可能导致OOM。...直接缓存区 直接内存也称直接缓存区,主要是解决一个java读取慢的问题,jdk1.4以后jvm 引入了NIO在操作系统划出了一块直接的缓存区可以直接被java访问。就是所称的零拷贝。...代码实现 非直接缓冲区 /** * @author: csh * @Date: 2021/5/8 18:49 * @Description:非直接缓存冲(堆内存) */ public class...模拟直接内存溢出 /** * @author: csh * @Date: 2021/5/13 18:37 * @Description:OOM 模拟直接内存溢出 * * Exception in...,都有利有弊,比如直接内存可以尽大限度的拓展内存空间,但是一但发生oom那排查起来非常麻烦,因为这块控制是非常难的,并且只有当full gc才会被回收,当然也是可以通过:通过-XX:MaxDirectMemorySize

1.4K20

Java通过JNI申请直接内存

函数申请内存, 主要就是要观察在Java中, 堆外内存/直接内存的申请方式, 以及如何被管理的....在Java中可以通过使用ByteBuffer.allocateDirect() 和 unsafe.allocateMemory() 以及本文介绍的通过JNI申请内存, 这三种方式的区别是什么呢?...我们再改变一下, 不使用malloc分配内存, 而是使用mmap分配内存....两个区间都是32MB, 与我们申请的吻合 哎,在这里我们看到使用mmap申请的内存, 我们拿到的起始地址就是maps中显示的地址, 是吻合的....而Java方式拿到的地址, 还是一样, 偏差了0x10 简单说, malloc底层调用mmap系统函数申请内存(还有一种是brk系统函数), 只是malloc又对从操作系统拿到的内存做了手脚, 之所以做手脚是为了合理管理内存

1.3K30

MONGODB 索引 大内存 与连锁思维

创建MONGODB 的索引,属于基本操作,但如果是一个有2T 的 collection 要一个索引,也属于基本操作,实际上量变产生质变,很多问题的考虑都不在那么简单。...在MONGODB 3.4 的时候有一个参数 setParameter: maxIndexBuildMemoryUsageMegabytes: 1024 这个参数就直接为后台添加索引加速的,如果有足够的内存...,(内存的与wiretiger 无关),则会加速background 添加索引的速度。...所以大collection添加索引,就是一个量变到质变的过程,你需要考虑的问题1 你内存的大小,是否能hold 你添加的索引2 业务上访问度是否是高强度的,如果是,那你及需要考虑上面提到的方法3 oplog...的设计大小其实和你以后一些基础操作有关4 尽量抛弃旧版本,升级到 3.6 及以上的版本,这样可以快速调整oplog的大小 所以一件看上去不值得一提的索引的事情,其实如果量大到一定程度,则考虑和需要分析的问题和

2.5K10

关于JVM直接内存触发Full GC

今天在研究JVM的直接内存溢出时发现直接内存和堆内存一样,在直接内存快满时会触发full gc,full gc会将未被引用的对象及其指向的直接内存释放掉,如下为测试代码: package test.oom...            ByteBuffer buf = ByteBuffer.allocateDirect(_1MB);                          // 将引用加入集合中防止被GC回收导致直接内存被释放... eden space 16384K, 6% used [0x00000000eb280000,0x00000000eb375d18,0x00000000ec280000) 当程序在执行第一次的时候内存为...300多M,当buf不添加到list集合中时,不会出现OOM,JVM每次都释放直接内存; 当buf添加到list中,则出现OOM,由于buf被引用,无法被full gc回收,导致直接内存为600M,而最大直接内存

2.6K70

直接内存回收中的等待队列

直接内存回收过程中,有可能会造成当前需要分配内存的进程被加入一个等待队列,当整个node的空闲页数量满足要求时,由kswapd唤醒它重新获取内存。...如果当前进程加入到了pgdat->pfmemalloc_wait这个等待队列中,那么进程就不会进行直接内存回收,而是由kswapd唤醒后直接进行内存分配。...直接内存回收执行路径是: __alloc_pages_slowpath() -> __alloc_pages_direct_reclaim() -> __perform_reclaim() -> try_to_free_pages...之后进程由于内存不足,对zonelist进行直接回收时,会调用到try_to_free_pages(),在这个函数内,决定了进程是否加入到node结点的pgdat->pfmemalloc_wait这个等待队列中...如果不平衡,则加入到pgdat->pfmemalloc_wait等待队列中,如果平衡,则直接返回,并由当前进程自己进行直接内存回收。

1.6K40

Java直接(堆外)内存使用详解

本篇主要讲解如何使用直接内存(堆外内存),并按照下面的步骤进行说明: 相关背景-->读写操作-->关键属性-->读写实践-->扩展-->参考说明 希望对想使用直接内存的朋友,提供点快捷的参考。...读写数据 在直接内存中,通过allocateDirect(int byte_length)申请直接内存。这段内存可以理解为一段普通的基于Byte的数组,因此插入和读取都跟普通的数组差不多。...限制大小——limit 我们可能想要改变这段直接内存的大小,因此可以通过一个叫做Limit的属性设置。 limit则可以通过limit()获得,通过limit(int)进行设置。...public final int remaining() { return limit - position; } 读写实践 写操作主要就是按照自己的数据类型,写入到直接内存中...由于没有找到直接操作直接内存的方法: 因此如果想在JVM应用中使用直接内存,需要申请一段堆中的空间,存放数据。 如果有更好的方法,还请留言。

1.4K91

JVM内存与垃圾回收篇第11章直接内存

第 11 章 直接内存 1、直接内存概述 直接内存 不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。 直接内存是在Java堆外的、直接向系统申请的内存区间。...来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存 通常,访问直接内存的速度会优于Java堆。即读写性能高。 因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。...,Java程序的内存占用明显减少 2、BIO 与 NIO 非直接缓存区(BIO) 原来采用BIO的架构,在读写本地文件时,我们需要从用户态切换成内核态 直接缓冲区(NIO) NIO 直接操作物理磁盘...OOM 直接内存也可能导致OutofMemoryError异常 由于直接内存在Java堆外,因此它的大小不会直接受限于-Xmx指定的最大堆大小,但是系统内存是有限的,Java堆和直接内存的总和依然受限于操作系统能给出的最大内存...直接内存的缺点为: 分配回收成本较高 不受JVM内存回收管理 直接内存大小可以通过MaxDirectMemorySize设置 如果不指定,默认与堆的最大值-Xmx参数值一致 ---- 代码示例 1 代码

45120

Java直接内存分配和释放的讲解

前言 直接内存是分配在JVM堆外的,那JVM是怎么对它进行管理的呢?本文主要介绍一下在Java中,直接内存的空间分配和释放的机制。 直接内存和堆内存的比较 在比较两者的性能时,我们分两方面来说。...申请空间的耗时:堆内存比较快 读写的耗时:直接内存比较快 直接内存申请空间其实是比较消耗性能的,所以并不适合频繁申请。...但直接内存在IO读写上的性能要优于堆内存,所以直接内存特别适合申请以后进行多次读写。 为什么在申请空间时,堆内存会更快?...堆内存的申请是直接从已分配的堆空间中取一块出来使用,不经过内存申请系统调用,而直接内存的申请则需要本地方法通过系统调用完成。 而为什么在IO读写时,直接内存比较快?因为直接内存使用的是零拷贝技术。...所以直接内存一般有两个使用场景: 复制很大的文件 频繁的IO操作,例如网络并发场景 直接内存由于是直接分配在堆外的,所以不受JVM堆的大小限制。

67140

实战:OutOfMemoryError 异常(四) -- 本机直接内存溢出

关于本机直接内存溢出的情况。...DirectMemory 容量可通过 -XX:MaxDirectMemorySize 指定,如果不指定,则默认与 Java 堆最大值(-Xmx 指定)一样,以下代码中越过了 DirectByteBuffer 类,直接通过反射获取...因为,虽然使用 DirectByteBuffer 分配内存也会抛出内存溢出异常,但它抛出异常时并没有真正向操作系统申请分配内存,而是通过计算得知内存无法分配,于是手动抛出异常,真正申请分配内存的方法是...,一个明显的特征是在 Heap Dump 文件中不会看见明显的异常,如果在排查问题时发现 OOM 之后 Dump 文件很小,而程序中又直接或间接使用了NIO,那就可以考虑检查一下是不是这方面的原因。...高级特性与最佳实践》 Copyright: 采用 知识共享署名4.0 国际许可协议进行许可 Links: https://lixj.fun/archives/实战outofmemoryerror异常四--本机直接内存溢出

41210

数据库“炸了”,CPU内存?或许还有更好的解决方法!

在我经历过的应用系统压力测试工作中发现,大厂提供的应用产品通常服务器压力和数据库压力是基本持平的,小的开发商提供的应用系统往往是服务器还没有明显压力,CPU、内存使用率都很低,数据库却已经“炸了”。...所以,底层代码逻辑上是否与数据库合理交互是原因之一,有经验的开发工程师会思考如何尽可能地少与数据库交互,把推拉数据库完成的功能模块转化为通过服务器计算来完成,从而将数据库压力转移到服务器上。...Redis缓存数据库是将数据以键值对的形式缓存在内存中的高效数据库。...在开发中,我们可以将一些频繁读取的数据放到Redis中,例如中签公告、人员名单、产品清单等,用户在访问这些数据的时候,如果发现缓存中有数据,直接取用,不仅减轻了数据库的压力,读取速度还特别快,因为内存的读写速率是普通机械硬盘的几百倍...纵向提高数据库配置 CPU、内存,性能提升也是有限的,幸运的是,目前大部分数据库都支持分布式架构,或主从读写分离架构。

1.4K30

JVM又爆了,别傻傻只会重启内存

前提:某大型跨境电商业务发展非常快,线上机器扩容也很频繁,但是对于线上机器的运行情况,特别是jvm内存的情况,一直没有一个统一的标准来给到各个应用服务的owner。...经过618大促之后,和运维的同学讨论了下,希望将线上服务器的jvm参数标准化,可以以一个统一的方式给到各个应用,提升线上服务器的稳定性,同时减少大家都去调整jvm参数的时间。...总结: Jvm调优这块还是有一定难度的有时候我们会碰到下面这些问题:OutOfMemoryError,内存不足、内存泄露、线程死锁、Java进程消耗CPU过高。...这些问题在日常开发容易忽视,比如有的人遇到上面的问题只是重启服务器或者调大内存,而不会深究问题根源,但能够理解并解决这些问题是Java程序员进阶的必备要求。

2.1K10

服务器内存监测

本文当然不是研究如何分析内存泄漏的产生原因与解决方案,而是在此之前的一步,通过简单的内存监测方式来预测内存泄漏的 潜在可能性 或者 偶发性 等。...我这边需要监测 系统内存 与 jvm堆内存 ,最终的结果会展示各个时间点的内存情况,所以需要一个时间类,表示每个切片的时间点。...,可以采用内存或者redis方式存储,我这边简单起见,就直接内存存储这些数据了,注册一个实例到spring的容器中,用于在系统的任何地方都能调用。...timeMarkInterval是存储定时器id的,在销毁之前释放定时器;physicMemory和heapMemory获取图表div节点,用于echarts节点获取;systemInfo则会存储定时从服务器拉取到的数据...datetime.getSeconds() return `${hourStr}:${minuteStr}:${secondStr}` } 最终的效果 以上大段的代码,看上去确实有些枯燥,直接上结果图吧

13620
领券