Java
文章平均质量分 86
Java学习笔记
GreyZeng
程序员,架构师,项目经理
展开
-
Java SE 23 新增特性
在这两种情况下,即通过 long、float、double 和布尔类型进行 switch 以及使用基元变量进行模式匹配时,与所有新的 switch 功能一样,switch 必须要涵盖所有可能的情况。通过 instanceof 和 switch,我们可以检查对象是否属于特定类型,如果是,则将该对象绑定到该类型的变量,执行特定的程序路径,并在该程序路径中使用新变量。在 JDK 23 之前,下述代码中,Child1的构造函数,只能先通过super构造父类,然后才能初始化子类的 b 这个变量。原创 2024-09-19 00:06:36 · 1027 阅读 · 0 评论 -
Java SE 22 新增特性
在 Java 17 中,这些 API 被合并为 “Foreign Function & Memory API”(FFM API),直到 Java 18,它一直处于孵化阶段。在 Java SE 11 中,无法执行,因为只支持单个 Java 文件运行,但是到了 Java SE 22,可以支持多个文件源码运行,比如上述两个类,在 Java SE 22 下,可以通过。然而,一旦我们添加更多的 Java 文件,Java 11 中所谓的 "启动单个文件源代码 "机制就不再起作用了。在 Java 19 中,原创 2024-03-20 00:04:28 · 833 阅读 · 0 评论 -
Java SE 21 新增特性
该功能首次在 Java SE 19 中预览,在Java SE 20中发布第二次预览版,在此版本中成为永久性功能。这意味着它可以在任何为 Java SE 21 编译的程序中使用,而无需启用预览功能。该功能首次在 Java SE 17 中预览,在在此版本中成为永久性功能。这意味着它可以在任何为 Java SE 21 编译的程序中使用,而无需启用预览功能。作为本版本的预览功能推出。字符串模板是对 Java 现有字符串字面量和文本块的补充,它将字面文本与嵌入式表达式和模板处理器结合起来,从而产生专门的结果。原创 2023-09-25 14:12:01 · 236 阅读 · 0 评论 -
Java SE 20 新增特性
中,Switch 类型匹配作为预览功能推出,到 Java SE 20 ,这个功能已经是第四次预览版,在 Java SE 17 中,可以通过加强 switch 表达式和语句的模式匹配能力,减少了定义这些表达式所需的模板,此外,switch 中增加了空值的支持。此外,在 Java SE 20 中,移除了对 record 命名模式的支持,在 Java SE 19 中,如下写法是对的。中,Java SE 20 的 record 支持类型推断,例如,定义了如下数据结构。在 Java SE 20 之前,需要这样做。原创 2023-05-03 20:02:59 · 758 阅读 · 1 评论 -
Java SE 19 虚拟线程
有一个所谓的载体线程池,一个虚拟线程被临时映射到该池中。一旦虚拟线程遇到阻塞操作,该虚拟线程就会从载体线程中移除,而载体线程可以执行另一个虚拟线程(新的或之前被阻塞的)。虚拟线程解决了这个问题,从 Java 代码的角度来看,虚拟线程感觉就像普通的线程,但它们不是。这使得我们可以编写灵活的代码,在运行时决定它应该在虚拟线程还是平台线程中运行。,而这些线程是很消耗资源的,如果启动的线程过多,会给整个系统的稳定性带来风险。创建的执行器服务,为每个任务创建一个新的虚拟线程。,我们也可以明确地启动虚拟线程。原创 2022-09-26 20:09:15 · 758 阅读 · 0 评论 -
Java SE 16 record 类型说明与使用
假设我们想创建一个不可变的类 Point,它有 x 和 y 的坐标。我们想实例化Point对象,读取它们的字段,并将它们存储在 List 中或在 Map 中作为键值使用。如果要覆盖 record 的默认构造函数,则函数入参一定要和 record 的入参保持一致,否则会报错。和我们最初始的 Point 类定义是一样的,所以 record 可以大量简化代码的编写。record 中可以自定义非 static 方法,例如。record 也可以实现接口,但是无法继承类。我们可以像正常使用类一样使用 record。原创 2022-09-23 16:22:29 · 901 阅读 · 0 评论 -
Java SE 19 新增特性
在 Java 17 中,这些 API 被合并为 “Foreign Function & Memory API”(FFM API),直到 Java 18,它一直处于孵化阶段。如果一个任务由不同的子任务组成,可以并行完成(例如,从数据库访问数据、调用远程 API 和加载文件),我们可以使用 Java 多线程的一些工具类来完成。Java SE 19,构造哈希表的时候,由于有扩容因子 0.75 的设置,所以如果要开辟一个 120 空间的哈希表,需要如下定义。,我们等待所有任务完成–或者至少有一个任务失败或被取消。原创 2022-09-22 13:36:06 · 710 阅读 · 0 评论 -
Java 对象的内存布局(HotSpot 实现)
我们可以通过来查看一下某个对象的内存布局引入依赖原创 2022-09-12 12:06:54 · 357 阅读 · 0 评论 -
Java 多线程(七):线程池
作者:Grey原文地址:博客园:Java 多线程(七):线程池CSDN:Java 多线程(七):线程池线程池内部是通过队列结合线程实现的,当我们利用线程池执行任务时:如果此时线程池中的线程数量小于,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。如果此时线程池中的线程数量等于,但是缓冲队列未满,那么任务被放入缓冲队列。如果此时线程池中的线程数量大于等于,缓冲队列已满,并且线程池中的线程数量小于,建新的线程来处理被添加的任务。如果此时线裎池中的线数量大于,缓存冲队列已满, 并且线程池中的原创 2022-09-12 00:02:55 · 220 阅读 · 0 评论 -
Java 多线程(五):锁(三)
更通俗的讲就是在读锁没有释放的时候是可以获取到一个写锁,获取到写锁之后,读锁阻塞,这一点和读写锁一致,唯一的区别在于。有两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束。Semaphore 是信号量,可以做限流,限制 n 个线程并发,释放一个线程后就又能进来一个新的线程。程序可以并发执行,用线程操作1,2,3,然后操作完毕后再合并, 然后执行后续的逻辑操作,就可以使用。底层原理是:如果没有线程许可可用,则线程阻塞,并通过 AQS 来排队,可以通过。原创 2022-09-11 17:38:28 · 183 阅读 · 0 评论 -
Java 多线程(四):锁(二)
作者:Grey原文地址:博客园:Java 多线程(四):锁(二)CSDN:Java 多线程(四):锁(二)需要实际测试一下。示例代码见:Java SE 11 下,运行得到的执行结果是:可以看到,在大数据量的情况下,LongAdder 的效率最高。关于 LongAdder 的一些说明,参考如下两篇博客:从 LONGADDER 看更高效的无锁实现Java 8 Performance Improvements: LongAdder vs AtomicLong其中“ReentrantReadWriteLock”原创 2022-09-11 08:30:49 · 183 阅读 · 0 评论 -
Java 多线程(三):锁(一)
第二个线程:也把 3 这个数拿过来,线程本地区域做计算加 1 后,在回写回去的时候,会做一次比较,如果原来的值还是 3,那么说明这个值之前没有被打扰过,就可以把 4 写回去,如果这个值变了,假设变为了 4,那么说明这个值已经被其他线程修改过了,那么第二个线程需要重新执行一次,即把最新的 4 拿过来继续计算,回写回去的时候,继续做比较,如果内存中的值依然是 4,说明没有其他线程处理过,第二个线程就可以把 5 回写回去了。因此,即使对象值被反复读写,写回原值,只要时间戳发生变化,就能防止不恰当的写入。原创 2022-09-10 20:09:42 · 270 阅读 · 0 评论 -
Java 多线程(二):并发编程的三大特性
对象 T 在创建过程中,背后其实是包含了多条执行语句的,由于有 CPU 乱序执行的情况,所以极有可能会在初始化过程中生成以一个半初始化对象 t,这个 t 的 m 等于 0(还没有来得及做赋值操作)在从内存中读取数据的时候,根据的是程序局部性的原理,按块来读取,这样可以提高效率,充分发挥总线 CPU 针脚等一次性读取更多数据的能力。,指的就是内存中的某个数据,假如第一个 CPU 的一个核读取到了,和其他的核读取到这个数据之间的可见性。,恢复中断的代价是比较大的,所以我们要想尽办法不让流水线中断。原创 2022-09-09 22:16:43 · 344 阅读 · 0 评论 -
Java 多线程(一):基础
程序是计算机的可执行文件;进程是计算机资源分配的基本单位;线程线程是一个程序里面不同的执行路径,多个线程共享进程中的资源;协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。协程在子程序内部可中断的,然后转而执行别的子程序,在适当的时候再返回来接着执行。原创 2022-09-08 20:32:49 · 456 阅读 · 0 评论 -
Java SE 18 新增特性
在 Java SE 18 之前的 Java中,标准字符集会因操作系统和语言设置的不同而不同。Java 标准字符集决定了在 JDK 类库的许多方法中如何将字符串转换为字节,反之亦然(例如,在写入和读取文本文件时)。当一个应用程序在一个环境中被开发和测试,然后在另一个环境中运行( Java 选择了不同的默认字符集),这可能导致不可预测的行为。方案一:在调用所有将字符串转换成字节的方法时指定字符集,反之亦然。其次,如上所述,指定的字符集并不用于所有的 API 方法。这个方案会导致大量的代码重复,容易出错。原创 2022-08-22 13:22:22 · 671 阅读 · 0 评论 -
Java SE 17 新增特性
从 Java 9 引入模块化开始,JDK 对于其内部的 API 的访问限制就已经明确开始落地,只是当时我们可以通过配置启动参数 --illegal-access 来继续使用 JDK 的内部 API,其中 Java 9 ~ Java 15 这个参数默认 permit,Java 16 默认 deny。然而,这个功能自从它们被引入后就没有什么用处了,而且需要大量的精力来维护它,所以这个 JEP 删除了基于 Java 的实验性超前(AOT)和及时(JIT)编译器。包下面的类及其成员也是内部 API。原创 2022-08-22 07:19:33 · 363 阅读 · 0 评论 -
Java SE 16 新增特性
Sealed Classes 是在Java SE 15中首次引入的,它提供了一种机制来确定哪些子类被允许扩展或实现父类或接口。要注意的是,jpackage 不支持交叉编译,也就是说在 windows 平台上是不能打包成 MacOS 或者 Linux 系统的软件格式的。在 Java SE 14 中开始作为预览功能,Java SE 16 中被正式启用。在 Java SE 14 中是预览功能,到Java SE 16中正式启用。作为对接口中默认方法的增强,随着 Java SE 16 的发布,Linux 平台下为。原创 2022-08-21 23:06:24 · 268 阅读 · 0 评论 -
Java SE 15 新增特性
如果没有一个密封的类,编译器就不能合理地确定所有可能的子类都被我们的 if-else 语句所覆盖。隐藏类的目标是允许在运行时创建不能被发现的类。像这样的类通常有一个很短的生命周期,因此,隐藏类被设计成在加载和卸载时都很高效。instanceof 类型匹配功能在 Java SE 14 中进行了预览,Java SE 15 旨在继续其预览状态,没有新的增强功能。请注意,当前版本的 Java 确实允许创建类似于隐藏类的匿名类。这种有限的、详尽的层次结构是使用密封类的一大好处。然而,默认的垃圾收集器仍然是 G1。原创 2022-08-21 17:04:59 · 213 阅读 · 0 评论 -
Java SE 14 新增特性
这个功能在 Java SE 14 中是预览功能。switch 表达式在 Java SE 12 和 Java SE 13 中一直是预览功能,现在在 Java SE 14 中成为正式功能。在 Java SE 14 后,优化了 NPE 的报错提示,在 Java SE 14 下执行,报错信息如下。在Java SE 14 中,Text Blocks 仍处于预览阶段,并增加了一些新功能,增加了。Records 到 Java SE 16 正式发布,在 Java SE 14 中是预览功能。原创 2022-08-21 10:45:00 · 346 阅读 · 0 评论 -
Java SE 10 Application Class-Data Sharing 示例
通常来说,如果要执行 class 字节码,JVM需要执行下面的一些步骤:给定一个类的名字,JVM 需要从磁盘上面找到这个文件,加载,并验证字节码,最后将它加载进来。Application Class-Data Sharing 扩展了 CDS,不仅可以将 JDK 类库,还可以将应用程序的类存储在 JSA 文件中,并在 JVM 进程中共享。在这个过程中,类文件被从档案中提取出来,转换为特定架构的二进制形式,并存储在JVM进程的主内存中。清单,这里面不仅有 JDK 的 class,也有应用程序的 class。原创 2022-08-20 16:02:20 · 272 阅读 · 0 评论 -
Java SE 13 新增特性
因此,在 Java 13 中引入了新的实现方式,使用了新的实现 NioSocketImpl 来代替老旧的 PlainSocketImpl 实现。java.net.Socket 和 java.net.ServerSocket 类早在 Java 1.0 时就已经引入了,它们的实现的 Java 代码和 C 语言代码的混合,维护和调试都十分不易;ZGC 是 Java SE 11 中引入的一个实验性垃圾收集器,它承诺在10毫秒或更短的时间内实现 stop-the-world。默认情况下,这个值是300秒。原创 2022-08-20 09:51:20 · 231 阅读 · 0 评论 -
Java SE 12 新增特性
如果两个文件是一样的,该方法返回 -1。否则,它返回两个文件不同的第一个字节的位置。如果其中一个文件在检测到差异之前结束,则返回该文件的长度。我们可以指定两个收集器(称为下游收集器)和一个合并函数,将两个收集器的结果合并。对于某些要求,你可能想用两个收集器来终止一个流,而不是一个,并将两个收集器的结果结合起来。,我们可以创建一个格式化器。一种方法是写一个自定义的收集器,将最小值和最大值累积到一个2元素的。语句,并使用箭头符号来消除容易出错的中断语句,这个特性在。方法将一个任意的函数应用于一个字符串。原创 2022-08-19 21:20:13 · 198 阅读 · 0 评论 -
Java SE 11 新增特性
JPMS 的另一个优点是,现在可以创建一个仅包含应用程序所需模块的 Java 运行时,从而大大减小了依赖包的大小。通过明确定义的模块边界,现在可以更轻松地删除 Java API 中过时的部分。如果您尝试编译或运行一个应用程序,该应用程序在 JDK 9 或 JDK 10 上使用这些模块中的 API 的时候会报错。如果在代码中使用这些模块中的 API,则需要将它们作为单独的模块或库提供。元模块包括六个模块,这些模块将不再是 Java SE 11 标准的一部分,也不再包含在 JDK 中。这里有一个简单的例子。..原创 2022-08-18 14:54:58 · 177 阅读 · 0 评论 -
Java SE 10 新增特性
而在 Java 10 中还是做了小小调整,当 G1 的并发收集线程不能快速的完成全 GC 时,就会自动切换到并行收集,这可以减少在最坏情况下的 GC 速度。在Java中,var是一个特殊的新类型,你仍然可以在你的代码的其他地方使用var,比如作为一个变量或类名。第一步是创建应该被归档的类的列表,用适当的标志启动你的应用程序,并指出你希望列表被存储的位置。共享数据缓存意味着小型应用程序的启动时间有了很大的改善,因为在这种情况下,核心类的相对大小要大于应用程序本身。方法的返回类型,读者就不可能知道x的类型。..原创 2022-08-17 23:00:11 · 175 阅读 · 0 评论 -
Java SE 9 模块化示例
当模块A需要模块B时,模块A称为读取模块B,模块B由模块A读取。to 指令使您能够在逗号分隔的列表中精确指定哪些模块或模块的代码可以访问导出的包,这称为限定导出。引用b模块,那么c模块即便没有直接声明依赖于b模块,它对b模块也是具有可读性的,这个称之为隐含可读性。工具有许多新的选项(见jar -help),其中之一是打印作为模块化JAR打包的模块的模块声明。开头,后跟唯一的模块名称和括在大括号中的模块正文,格式如下。的文件中定义的模块声明的编译版本。选项指定的是主模块,斜线后的值是模块中主类的类全名。...原创 2022-08-16 23:33:48 · 253 阅读 · 0 评论 -
Java SE 9 多版本兼容 JAR 包示例
Java 9 版本中增强了Jar 包多版本字节码文件格式支持,也就是说在同一个 Jar 包中我们可以包含多个 Java 版本的 class 文件,这样就能做到 Jar 包升级到新的 Java 版本时不用强迫使用方为了使用新 Jar 包而升级自己的业务模块 Java 版本,也不用针对不同最低支持 Java 版本提供不同的 Jar,真正的做到了一个 Jar 包兼容所有的目的。文件配置,注意,相关的文件夹或者包有调整,需要做对应的调整。目录下存的是新版本 JDK 编写的代码。类用新的 JDK 版本特性来实现。原创 2022-08-15 11:48:34 · 304 阅读 · 0 评论 -
Java SE 9 新增特性
是对变量或参数定义的变量系列的动态强类型引用,包括静态字段,非静态字段,数组元素或堆外数据结构的组件。在各种访问模式下都支持访问这些变量,包括简单的读/写访问,引入了模块系统,模块就是代码和数据的封装体。有着相似的功能,但会更加安全,并且,在并发方面也提高了不少性能。接口的实例标识一个本地进程,它允许查询进程状态并管理进程,的解释器类似,可以直接输入表达式并查看其执行结果。就可以使用它,并得到相同的结果。中包含值,那么就返回包含这个值的。指定的值,否则返回一个预设的值。包含值,则对其包含的值调用函数。...原创 2022-08-14 18:04:35 · 268 阅读 · 0 评论 -
Java SE 8 新增特性
可以用一个 Lambda 表达式来指定这个动作。在 Java SE 8 中,接口可以支持默认方法,即:我们可以指定接口的某个方法的默认实现,这样的话,子类就不需要重写这个方法,可以使用接口的默认实现,同时,Java SE 8 中,接口也支持静态方法。更好的一种方式是,定义一个 Local Class,将规则分离出来,这样一来,规则无论如何变化,主流程的代码是不需要调整的,以上述例子来说明。上述代码中,如果要在接口中添加一个方法,那么所有实现这个接口的客户端都要重新实现这个方法,非常麻烦。原创 2022-08-13 17:40:53 · 380 阅读 · 0 评论 -
AD 域登录验证
注意:在测试的时候需要将 x.x.x.x,xxx,abc,123abc.替换成相应的域服务器 IP ,域服务器端口,域用户名,域用户密码。系统在登录的时候,需要根据用户名和密码验证连接域服务器进行验证此用户是否为域用户。某个域用户是:abc@adservice.com 密码:abc123.spring-ldap-core 版本:2.0.2.RELEASE。AD域为:DC=adservice,DC=com。单元测试:ADAuthJavaTest.java。域服务器地址:x.x.x.x。原创 2022-06-22 08:30:11 · 2124 阅读 · 0 评论 -
OkHttpClient 调优案例
占了前两位,由于很多同事开发的时候,没有定义有意义的线程名称,所以。日志文件上传上去后直接生成分析报告,并且可以导出为PDF。因为我们有好多的服务,每个服务都可能会用。方法遍布各地,这个方法有什么问题呢?系统运行一段时间后,线程数量飙升,所以,我们排查了一下系统中所有使用。这里的线程数入手,很显然,这里是。完全是可以复用的,所以不需要。这2031个线程不好排查,这个构造方法中,每次拿一个。这个工具是在线的,可以将。以下是我导出的分析结果。原创 2021-11-20 08:23:22 · 1517 阅读 · 2 评论 -
Java 中的引用类型和使用场景
Java中的引用类型分成「强引用」,「软引用」, 「弱引用」, 「虚引用」。原创 2021-11-30 14:31:47 · 306 阅读 · 0 评论 -
Java 中的 HashMap
作者:Grey原文地址:Java 中的 HashMap先生成新数组。遍历老数组中的每个位置上的链表上的个元素。取个元素的key,并基于新数组长度,计算出每个元素在新数组中的下标。将元素添加到新数组中去。所有元转移完了之后,将新数组赋给HashMap对象的table属性。同样先生成新数组。遍历老数组中的每个位置上的链表或红黑树。如果是链表,则直接将表中的每个元索重新计算下标,并添加到新数组中去。如果是红黑树,则先遍历红黑树,先计算出红黑树中每个元索对应在新数组中的下标位置。所有元素转移完了之后,将新数组赋给H原创 2021-11-11 19:03:52 · 2019 阅读 · 0 评论 -
JavaSE实现IoC
简单地说,IoC 是反转控制,类似于好莱坞原则,主要有依赖查找和依赖注入实现依赖查找是主动或手动的依赖查找方式,通常需要依赖容器或标准API实现。而依赖注入则是手动或自动依赖绑定的方式,无需依赖特定的容器和API。原创 2021-11-10 20:29:10 · 266 阅读 · 0 评论 -
Java IO学习笔记八:多路复用到Netty
但是对于每次服务端的Handler,如果都要加@Sharable,就会非常不好扩展,Netty里面提供了一个没有任何业务功能的并且标注为@Sharable的类:ChannelInitializer, 每个业务handler只需要重写其initChannel()方法即可,我们可以改造一下NettyClientSync和NettyServerSync的代码,并用Netty推荐的写法来修改。Netty+最朴素的阻塞的方式来实现一版客户端和服务端通信的代码,然后再重构成Netty官方推荐的写法。原创 2021-11-10 19:14:26 · 439 阅读 · 0 评论 -
Java IO学习笔记七:多路复用从单线程到多线程
将N个FD分组(这里的FD就是Socket连接),每一组一个selector,将一个selector压到一个线程上(最好的线程数量是: cpu核数或者cpu核数*2)假设有100w个连接,如果有四个线程,那么每个线程处理25w个。考虑有一个fd执行耗时,在一个线性里会阻塞后续FD的处理,同时,考虑资源利用,充分利用cpu核数。其他事件不注册写事件。由于其处理是线性的,且我们要开很多个线程来处理,所以。数组,一个用于分配服务端,一个用于分配每次客户端的。,即我们每次启动的服务端,另外一类就是连接服务端的。原创 2021-11-10 15:05:09 · 365 阅读 · 0 评论 -
Java IO学习笔记六:NIO到多路复用
而epoll,可以看成是SELECT和POLL的增强,在调用select/poll时候,都需要把fd集合从用户态拷贝到内核态,但是epoll调用epoll_ctl时拷贝进内核并保存,之后每次epoll_wait不做拷贝,而且epoll采用的是事件通知方式,每当fd就绪,系统注册的回调函数就会被调用,将就绪fd放到rdllist里面。,获取能读写数据的客户端,当客户端数量非常多的时候,服务端要轮询所有连接的客户端拿数据(调用),很多调用是无意义的,这样会导致频繁的用户态切换成内核态,导致性能变差。原创 2021-11-10 15:00:58 · 207 阅读 · 0 评论 -
Java IO学习笔记五:BIO到NIO
此外BIO模型还有一个非常严重的问题,因为是阻塞模型,所以客户端在和服务端建立连接后,如果迟迟不发送数据,服务端线程开销花费很多。服务端每次用两端口循环多次去和服务端建立连接,我们可以观察服务端建立连接的速度,通过服务端打印的信息可以感知到连接的速度。的时候,即有新的客户端连接进来,我们把这个client加入到列表中,然后遍历clients,去消费客户端的请求。再次运行客户端,并切换到服务端查看打印日志,速度比前面的BIO快了非常多。问题,即来了多少客户端就启动多少个线程,会导致服务端内存爆掉。原创 2021-11-10 14:21:15 · 122 阅读 · 0 评论 -
Java IO学习笔记四:Socket基础
启动三个客户端连接这个服务端, 然后再服务端执行netstat -ntap。内核已经为客户端和服务端建立了连接并完成了三次握手,在服务端使用。超过了服务端设置的最大连接数,服务端就不再继续向客户端发送报文。文件描述符6u就对应了服务端和客户端连接的一个Socket。在创建服务端的时候,我们指定了一个参数:backlog=2。服务端收到报文后,向客户端发送确认的报文,服务端进入。在具体的编程中,服务端和客户端都有很多配置的参数。无法执行,即:服务端此时是无法接收客户端的。方法,导致服务端其实没办法执行。原创 2021-11-10 14:16:49 · 231 阅读 · 0 评论 -
Java IO学习笔记三:MMAP与RandomAccessFile
mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用。才能做内存映射),即:把内核的pagecache和文件的数据地址空间映射起来。方法,可以修改文件内容的指针,从而可以方便读取和修改文件中的任意位置。通过mmap生成的且是堆外的和文件映射的内存区域。方法就等同于File中的。原创 2021-11-10 13:38:21 · 450 阅读 · 0 评论 -
Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer
allocate分配方式产生的内存开销是在JVM中的,allocateDirect分配方式产生的开销在JVM之外,也就是系统级的内存分配。3、经常复用DirectByteBuffer对象,即经常写入数据到DirectByteBuffer中,然后flip,再读取出来,最后clear,反复使用该DirectByteBuffer对象。所以在创建一个对象的情况下,HeapByteBuffer并没有什么优势,所以,开发中要使用ByteBuffer时,直接用DirectByteBuffer就行了)原创 2021-11-10 13:02:21 · 444 阅读 · 0 评论