jvm
文章平均质量分 76
jvm
yygr
这个作者很懒,什么都没留下…
展开
-
多态在JVM中的实现——invokevirtual与invokespecial
上面黄色的部分才是base这个引用所能访问的vtable的范围(关于vtable的生成有时间在总结),而普通的子类引用可以访问整个子类的vtable。所以base.print()其实是调用的覆盖后的print(),而baseMethod()则是调用的基类中的方法,并且base不能调用childMethod()方法。但在这里,子类对象的引用就可以调用其基类的私有方法,原因是,这里的调用不再是invokevirtual,而变成了invokespecial!这个是类被虚拟机加载进方法区之后,在方法区里面的布局。转载 2024-04-15 22:16:00 · 55 阅读 · 0 评论 -
深入理解JVM-内存结构
如6.5代码所示,如果加上了-XX:+DisableExplicitGC 虚拟机参数,执行到System.gc()时,直接内存不能被回收,只有当真正垃圾回收时才能被回收,这就导致了直接内存过大,会导致内存溢出。1.6 将这个字符串对象尝试放入串池,如果有则并不会放入,如果没有会把对象复制一份,放入串池,会把串池中的对象返回。1.8 将这个字符串对象尝试放放串池,如果有则并不会放入,如果没有则放入串池,会把串池中的对象返回。总结:如果程序中存在大量的字符串,且字符串重复的很多,可以通过入池来减少堆内存占用。转载 2024-04-14 12:28:07 · 48 阅读 · 0 评论 -
JVM可生产的最大线程数 Thread 数量
事先预测在这样的测试环境下,线程数量就只会受限于测试环境的内存大小(3G),可是实际的测试结果是线程数量在达到32K(32768,创建的数量最多的时候大概是33000左右)左右时JVM是抛出警告:Attempt to allocate stack guard pages failed,然后出现OutOfMemoryError无法创建本地线程。由上面的测试结果可以看出增大堆内存(-Xms,-Xmx)会减少可创建的线程数量,增大线程栈内存(-Xss,32位系统中此参数值最小为60K)也会减少可创建的线程数量。转载 2024-04-14 10:10:31 · 144 阅读 · 0 评论 -
JVM 程序计数器
来实现的,我们的程序计数器是Java对物理硬件的屏蔽和抽象,他在物理上是通过寄存器来实现的。但这些指令也不能直接交给CPU执行,他必须要经过一个解释器,这个解释器也是Java虚拟机执行引擎的一个组件,他就专门负责把每一条JVM指令(比如getstatic)解释成为机器码,机器码就可以交给CPU执行。比如,上面的例子中,JVM指令前面都有数字,这些数字可以理解成指令对应的地址,当这些指令被虚拟机加载到内存以后,地址就会跟上面的数字是类似的,根据这个地址信息可以找到命令执行它。用于存储下一条指令的地址。...转载 2022-08-15 15:56:49 · 137 阅读 · 0 评论 -
通俗易懂,一文彻底理解JVM方法区
https://baijiahao.baidu.com/s?id=1731211048001613394&wfr=spider&for=pc本篇文章从Java内存结构在不同JDK版本上的一些差异讲起,重点聊聊方法区!关于Java内存结构的差异,主要还是体现在jdk1.8和jdk1.7上,而且发生的主要变化在方法区上,在了解了什么是Java内存结构之后,我们知道,在jdk1.7上,Java内存结构主要包含以下5个部分:画个图就是这样的:解读方法区什么是方法区?说的简单点就是Java内存结构中的一块内存区域,用转载 2022-06-29 19:15:27 · 170 阅读 · 0 评论 -
为什么Java Lambda表达式引用的局部变量需要final
https://juejin.cn/post/6917144500674494478现象在编写Lambda表达式的时候,有时会引用Lambda表达式以外的变量。Lambda 表达式引用的局部变量必须是最终变量或实际上的最终变量,也就是说局部变量在被创建后不得被重新赋值。分析那么为什么呢?我看了网上的许多文章,写的都比较模糊,例如:它所能访问到的外部类中的各种变量都只是一份拷贝,因此为了防止你误以为能够直接修改外部类的变量,做了这样的设定。我看的云里雾里,直到我看了这篇转载 2022-04-21 10:58:35 · 185 阅读 · 0 评论 -
javap的基本用法
参考:javap -c命令详解 - 让编程成为一种习惯 - 博客园javap是JDK自带的反汇编器,可以查看java编译器为我们生成的字节码。通过它,我们可以对照源代码和字节码,从而了解很多编译器内部的工作。语法: 英文说明:C:\>javap -helpUsage: javap <options> <classes>...where options include: -c Disasse...转载 2022-04-21 10:43:17 · 1040 阅读 · 0 评论 -
性能分析神器VisualVM
https://www.cnblogs.com/wade-xu/p/4369094.htmlVisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优。这些功能包括生成和分析海量数据、跟踪内存泄漏、监控垃圾回收器、执行内存和 CPU 分析,同时它还支持在 MBeans 上进行浏览和操作。本文主要介绍如何使用 VisualVM 进行性能分析及调优。目录: 准备工作 内存分析篇 内存堆Heap转载 2022-04-10 08:04:08 · 382 阅读 · 0 评论 -
Java SPI机制
https://blog.csdn.net/qq_27292113/article/details/100324127SPI机制简介SPI的全名为Service Provider Interface.java spi机制的思想: 系统里抽象的各个模块,往往有很多不同的实现方案,在面向的对象的设计里,一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码。为了实现在模块装配的时候能不在程序里动态指明,这就需转载 2022-03-24 11:46:31 · 2683 阅读 · 2 评论 -
Java中SPI机制详解
https://www.jianshu.com/p/46b42f7f593c本文通过探析JDK提供的,在开源项目中比较常用的Java SPI机制,希望给大家在实际开发实践、学习开源项目提供参考。1 SPI是什么SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。整体机制图如下:Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制。系统设计的转载 2022-03-24 11:45:12 · 3770 阅读 · 0 评论 -
jdk源码中为什么把成员变量赋值给局部变量再操作
https://segmentfault.com/q/1010000040896700问题在对象的方法中使用对象的成员变量时,为什么喜欢先把它赋值给这个方法的局部变量?为了不可变性吗?先上代码:public class SomeObject{ private Subscription subscription; public void foo(long n){ Subscription s = this.subscription; s.request(转载 2022-03-21 21:17:34 · 624 阅读 · 0 评论 -
为何在volatile写 之前加storestore内存屏障即可,不需要 loadstore么?
为何在volatile写 之前加storestore内存屏障即可,不需要 loadstore么? - 知乎什么是内存屏障?小陈:老王,上一篇你引出了volatile底层是通过内存屏障来解决可见性和有序性问题的。首先我想问一下什么是内存屏障?老王:内存屏障啊,本质上也是一种指令,只不过它具有屏障的作用而已。小陈:额,这怎么说...老王:首先内存屏障是一种指令,无论是在JAVA内存模型还是CPU层次,都是有具体的指令对应的,是一种特殊的指令。小陈:嗯嗯,它转载 2022-03-19 15:14:53 · 975 阅读 · 0 评论 -
synchronized 实现原理与内存屏障详细解读
synchronized 实现原理与内存屏障 - 简书锁概述我们知道线程安全问题的产生前提是多个线程并发访问共享变量、共享资源(以下统称为共享数据)。于是,我们很容易想到保障线程安全的方法将多个线程对共享数据的并发访问转换为串行访问,即一个共享数据一次只能被一个线程访问,该线程访问结束后其他线程才能对其进行访问。锁(Lock)就是利用这种思路以保障线程安全的线程同步机制。按照上述思路,锁可以理解为对共享数据进行保护的许可证。对于同一个许可证所保护的共享数据而言,任何线程访问这些共享数据前必须转载 2022-03-18 13:23:03 · 779 阅读 · 0 评论 -
内存屏障(Memory Barriers/Fences) - 并发编程中最基础的一项技术
内存屏障(Memory Barriers/Fences) - 并发编程中最基础的一项技术_chuhan0449的博客-CSDN博客我们经常都听到并发编程,但很多人都被其高大上的感觉迷惑而停留在知道听说这一层面,下面我们就来讨论并发编程中最基础的一项技术:内存屏障或内存栅栏,也就是让一个CPU处理单元中的内存状态对其它处理单元可见的一项技术。CPU使用了很多优化技术来实现一个目标:CPU执行单元的速度要远超主存访问速度。CPU避免内存访问延迟最常见的技术是将指令管道化,然后尽量重排这些管道的执行以最大转载 2022-03-17 19:52:00 · 2217 阅读 · 0 评论 -
类加载机制详解
类加载机制_爱吃袜子的二哈的博客-CSDN博客一个Java文件从编码完成到最终执行,一般主要包括两个过程编译 运行编译,即把我们写好的java文件,通过javac命令编译成字节码,也就是我们常说的.class文件。运行,则是把编译生成的.class文件交给Java虚拟机(JVM)执行。而我们所说的类加载过程即是指JVM虚拟机把.class文件中类信息加载进内存,并进行解析生成对应的class对象的过程。例子,JVM在执行某段代码时,遇到了class A, 然而此时内存中并没有c转载 2022-03-17 19:13:50 · 382 阅读 · 0 评论 -
深入理解JVM(③)类是在什么时候进行加载的?
深入理解JVM(③)类是在什么时候进行加载的?_纪莫的博客-CSDN博客_类是在什么时候加载的前言Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称为虚拟机的类加载机制。类加载的时机一个类型从被加载到虚拟机内存中开始,到卸载除内存为止,它的生命周期将会经历加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initi转载 2022-03-17 17:28:28 · 570 阅读 · 0 评论 -
JVM中方法调用的内部实现原理
JVM中方法调用的内部实现原理_HoryC的博客-CSDN博客_jvm方法调用过程本文算是《深入理解Java 虚拟机》的学习笔记# 符号引用和直接引用首先来了解一下符号引用和直接引用的概念:Java类从加载到虚拟机内存开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用、卸载,共七个阶段。注意:加载、验证、准备、初始化这四个阶段发生的顺序是固定的,而解析阶段在某些情况下位于初始化之后。此外,因为这些阶段通常都是互相交叉地混合进行的,通常在一个阶段执转载 2022-03-17 17:20:01 · 250 阅读 · 0 评论 -
JVM系列-方法调用的原理
JVM系列-方法调用的原理 - 吴七羊 - 博客园JVM系列-方法调用的原理目的方法调用,目的是选择方法正确的执行版本,也就是找到方法的入口地址。方法调用指令方法调用的字节码指令一共有五种,分别是:invokestatic: 类方法:static invokespecial: 方法:实例构造器 私有方法:private 父类中的方法 invokevirtual 虚方法 final修饰的方法 invokeinterface 接口方法 in转载 2022-03-17 16:53:43 · 111 阅读 · 0 评论 -
happens-before是什么?JMM最最核心的概念,看完你就懂了
happens-before是什么?JMM最最核心的概念,看完你就懂了 - 知乎happens-before是JMM最核心的概念。对应Java程序员来说,理解happens-before是理解JMM的关键。我的并发系列文章,前面三篇学习了 Java并发机制底层实现的三个关键要素:volatile、synchronized、原子性操作。以及Java内存模型是为了解决在并发环境下由于 CPU缓存、编译器和处理器的指令重排序 导致的可见性、有序性问题。 其中重点学习了 volatile 的内存语义,以转载 2022-03-17 15:17:55 · 135 阅读 · 0 评论 -
浅谈偏向锁、轻量级锁、重量级锁
浅谈偏向锁、轻量级锁、重量级锁 - 简书为了换取性能,JVM在内置锁上做了非常多的优化,膨胀式的锁分配策略就是其一。理解偏向锁、轻量级锁、重量级锁的要解决的基本问题,几种锁的分配和膨胀过程,有助于编写并优化基于锁的并发程序。内置锁的分配和膨胀过程较为复杂,限于时间和精力,文中该部分内容是根据网上的多方资料整合而来;仅为方便查阅,后面继续分析JVM源码的时候也有个参考。如果对各级锁已经有了基本了解,读者大可跳过此文。隐藏在内置锁下的基本问题内置锁是JVM提供的最便捷的线程同步工具,在代转载 2022-03-16 16:55:16 · 236 阅读 · 0 评论 -
Kclass模型和JVM类加载过程详解
Kclass模型和JVM类加载过程详解_沮丧的南瓜-CSDN博客_kclass一、Klass模型Java的每个类,在JVM中,都有一个对应的Klass类实例与之对应,存储类的元信息如:常量池、属性信息、方法信息…… 看下klass模型类的继承结构 从继承关系上也能看出来,类的元信息是存储在原空间的; 普通的Java类在JVM中对应的是instanceKlass类的实例,再来说下它的三个字类 InstanceMirrorKlass:用于表示java.lang.Class,Java代码中获取转载 2022-03-14 20:43:56 · 872 阅读 · 0 评论 -
G1垃圾收集器详解
G1垃圾收集器详解_黑帽子技术的博客-CSDN博客1. 什么是G1垃圾收集器?①. G1(Garbage-First)是一款面向服务端应用的垃圾收集器,主要针对配备多核CPU及大容量内存的机器,以极高概率满足GC停顿时间的同时,还兼具高吞吐量的性能特征②. 在JDK1.7版本正式启用,是JDK 9以后的默认垃圾收集器,取代了CMS 回收器。2. 为什么名字叫Garbage First?①. G1是一个并行回收器,它把堆内存分割为很多不相关的区域(region物理上不连续),把堆分转载 2022-03-14 17:12:32 · 12159 阅读 · 3 评论 -
jvm大局观之内存管理篇(二):当java中new一个对象,背后发生了什么
jvm大局观之内存管理篇(二):当java中new一个对象,背后发生了什么 - 知乎前言本篇是jvm内存区域管理系列教程之一 java创建对象的过程全系列内容可在专栏中查阅jvm全局观?www.zhihu.com/column/c_1293612595426095104正在上传…重新上传取消今天我们谈谈 在java中new一个对象,背后发生了什么概括说来,就是 先后执行0.类加载检查,1.类加载(如果检查发现未加载),2.分配内存3.初始化零值,4.设置对象头,5.初始化转载 2022-03-14 15:35:48 · 207 阅读 · 0 评论 -
通过HSDB来了解String值的真身在哪里
通过HSDB来了解String值的真身在哪里 - 你假笨最近通过@RednaxelaFX的一篇文章得知了HSDB,并好好研究了一下用法,对学习jvm的人来说绝对是一个利器,可以摆脱GDB,直接图形化看内存结构布局,具体的用法我就不多说了,这篇文章介绍得很详细了,这次写文章主要是想通过这一利器来分析下String的值在java里的内存情况,不同场景下的String的值到底是在内存里的哪块区域,这里强调的是值,并不是对象,因为对象我们都知道是存在heap里的,我们看java.lang.String的源码转载 2022-03-14 14:42:37 · 132 阅读 · 0 评论 -
HSDB的使用示例
第一次使用HSDB - 小白一只726 - 博客园今天看了几篇大佬关于HSDB使用的文章,自己也依样画葫芦的用来一下,强大的一匹!!!HSDB(Hotspot Debugger),JDK自带的工具,用于查看JVM运行时的状态。HSDB位于C:\Program Files\Java\jdk1.8.0_212\lib里面,接下来启动HSDB:1 java -cp .\sa-jdi.jar sun.jvm.hotspot.HSDB 正常启动之后界面是这样的: 一篇空白,没啥好转载 2022-03-14 14:10:56 · 734 阅读 · 0 评论 -
jvm大局观之内存管理篇: 理解jvm安全点,写出更高效的代码
jvm大局观之内存管理篇: 理解jvm安全点,写出更高效的代码 - 知乎前言本篇是java内存区域管理系列教程之一 - 在得知GC Root的组成之后,如何在垃圾回收发生的时刻,找到GC Root,也就是起始垃圾. 并且能够在平常的编码中,合理的利用安全点,优化已有代码(文末)全系列内容可在本文专栏-jvm大局观中查阅jvm全局观?www.zhihu.com/column/c_1293612595426095104正在上传…重新上传取消看完本篇,读者会明白jvm如何通过根节点遍历转载 2022-03-14 13:40:03 · 384 阅读 · 0 评论 -
深入学习JVM-JVM 安全点和安全区域
深入学习JVM-JVM 安全点和安全区域 - 时光 - OSCHINA - 中文开源技术交流社区安全点JVM进行垃圾回收是一个非常复杂的过程,如何进行垃圾标记、什么时候进行垃圾、如果进行垃圾回收等等都非常复杂,当前主流测JVM在垃圾回收时都会进行STW(stop the world),即使宣称非常快的CMS垃圾回收期早期也会STW标记垃圾状态。那么这里有个问题,什么时候进行标记对象是否可以被回收呢?CPU在执行运算过程时需要把数据从内存中载入到寄存器,运算完后再从寄存器中载入到内存中,Jav转载 2022-03-14 13:36:38 · 588 阅读 · 0 评论 -
Class文件中的常量池详解(下)
Class文件中的常量池详解(下)_XINJing的专栏-CSDN博客NO9.类中引用到的field字段在常量池中是怎样描述的?(CONSTANT_Fieldref_info,CONSTANT_Name_Type_info)一般而言,我们在定义类的过程中会定义一些field字段,然后会在这个类的其他地方(如方法中)使用到它。有可能我们在类的方法中只使用field字段一次,也有可能我们会在类定义的方法中使用它很多很多次。举一个简单的例子,我们定一个叫Person的简单...转载 2022-03-10 14:58:02 · 324 阅读 · 0 评论 -
Class文件中的常量池详解(上)
Class文件中的常量池详解(上)_XINJing的专栏-CSDN博客_class文件常量池NO1.常量池在class文件的什么位置?我的上一篇文章《Java虚拟机原理图解》 1、class文件基本组织结构中已经提到了class的文件结构,在class文件中的魔数、副版本号、主版本之后,紧接着就是常量池的数据区域了,如下图用红线包括的位置:知道了常量池的位置后,然后让我们来揭秘常量池里究竟有什么东西吧~NO2.常量池的里面是怎么组织的?...转载 2022-03-10 14:11:49 · 1465 阅读 · 0 评论 -
final的两个重排序规则
final的两个重排序规则_riemann_的博客-CSDN博客_final域要遵守的两个重排序规则 对于final 域,编译器和处理器要遵守两个重排序规则: 1、在构造函数内对一个 final 域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 2、初次读一个包含 final 域的对象的引用,与随后初次读这个 final 域,这两个操作之间不能重排序。 先看一段示例代码: package com.test;/** * final域为基本转载 2022-03-08 10:27:20 · 1084 阅读 · 0 评论 -
JVM调优总结 -Xms -Xmx -Xmn -Xss
JVM调优总结 -Xms -Xmx -Xmn -Xss - 李克华 - 博客园堆大小设置 JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。我在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m。典型设置: java-Xmx3550m -Xms3550m -Xmn2g-Xss12..转载 2022-03-08 09:37:42 · 144 阅读 · 0 评论 -
Java GC 日志详解
https://blog.csdn.net/xlinsist/article/details/47858069?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefau转载 2022-03-08 09:22:40 · 504 阅读 · 0 评论 -
jvm线程字节码指令执行示例
java线程工作内存在栈中吗_JVM学习笔记——java内存模型_大内义兴的博客-CSDN博客概述JVM规范希望定义一套java内存模型(java memory model,JMM),使得java程序在不同的硬件平台下面都能展现出一致的内存访问机制。java内存模型规定所有变量保存在主内存中,每个线程有自己的工作内存。线程的工作内存中保存了该线程使用到的变量的主内存拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。不同的线程之间无法直接访问对方的工作内存,需通过转载 2022-03-08 09:04:28 · 127 阅读 · 0 评论 -
volatile 和 内存屏障
volatile 和 内存屏障 - 哈哈呵h - 博客园接下来看看volatile是如何解决上面两个问题的:被volatile修饰的变量在编译成字节码文件时会多个lock指令,该指令在执行过程中会生成相应的内存屏障,以此来解决可见性跟重排序的问题。内存屏障的作用:1.在有内存屏障的地方,会禁止指令重排序,即屏障下面的代码不能跟屏障上面的代码交换执行顺序。2.在有内存屏障的地方,线程修改完共享变量以后会马上把该变量从本地内存写回到主内存,并且让其他线程本地内存中该变量副本失效(使用MESI协议) 那么转载 2022-03-06 17:22:00 · 3275 阅读 · 12 评论 -
java一个对象占用多少字节?
java一个对象占用多少字节?_zzx410527的专栏-CSDN博客_java对象头占几个字节 最近在读《深入理解Java虚拟机》,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存? 想弄清楚上面的问题,先补充一下基础知识。 1、JAVA 对象布局 在 HotSpot虚拟机中,对象在内存中的存储的布局可以分为三块区域:对象头(Header),实例数据(Instance Data)和对齐填充(Padding)转载 2022-03-06 17:07:00 · 2483 阅读 · 0 评论 -
JVM之压缩指针——Compressed oops
JVM之压缩指针——Compressed oops_赶路人儿-CSDN博客_压缩指针1、32位 vs. 64位 32位与64位的对比是在2000年以后兴起的。然而64位CPU早就在超级计算机领域中得到应用了,只是最近几年64位CPU才在PC上成为主流配置。从32位到64位的转变,绝对不是一件简单的工作,因为几乎所有的东西,从硬件到操作系统都必须要发生改变。Java也是在这个改革的趋势中引入了64位的虚拟机。 在32位到64位的转变中,人们最大的获益是内存容量。在一...转载 2022-03-06 16:53:08 · 676 阅读 · 0 评论 -
Java中的synthetic详解
https://blog.csdn.net/moakun/article/details/80577702synthetic介绍有synthetic标记的field和method是class内部使用的,是编译器自动生成的,正常的源代码里不会出现synthetic field。举例1.内部类访问外部类方法下面的例子是最常见的synthetic fieldclass parent { public void foo() { } class inn转载 2022-03-04 10:39:36 · 1778 阅读 · 0 评论 -
happen-before原则的理解
https://www.cnblogs.com/niuyourou/p/12398252.html happen-before 可真是一个经典又老生常谈的话题,规则一共就八条,但看起来总有种抓不住重点的感觉。今天再整理一下对这八条规则的理解。 首先我的理解是 happen-before 的语义与在什么什么之前发生完全没有关系,其语义是如果 A hapen-bfore B,那么 A 的结果对 B 是可见的。通过这些规则可以保证程序按我们预想的方式运转。 我个人理解中将该原则分...转载 2022-03-06 15:51:36 · 196 阅读 · 0 评论 -
Java并发编程之happens-before和as-if-serial语义
https://blog.csdn.net/byhook/article/details/87971081概述本文大部分整理自《Java并发编程的艺术》,温故而知新,加深对基础的理解程度。指令序列的重排序我们在编写代码的时候,通常自上而下编写,那么希望执行的顺序,理论上也是逐步串行执行,但是为了提高性能,编译器和处理器常常会对指令做重排序。1) 编译器优化的重排序。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。 2) 指令级并行的重排序。现代处理器采用了指令级并转载 2022-03-03 21:15:50 · 137 阅读 · 0 评论 -
直接缓冲DirectByteBuffer详解
https://blog.csdn.net/huangyu1985/article/details/1039394621. 介绍ByteBuffer底层是通过byte数组的方式来存储数据的,所谓直接缓冲是指byte数组是通过堆外存存储的,并没有存在jvm堆上,不受jvm垃圾回收的约束。2. 直接缓冲和堆缓冲的创建方式ByteBuffer的创建有两种方式,allocate和allocateDirect,其中通过allocate创建出来的是HeapByteBuffer(堆缓冲),源码如下:转载 2022-02-28 16:54:18 · 1808 阅读 · 0 评论