1.如何评价jdk11?
2.Java程序员必备基础:JDK 5-15都有哪些经典新特性
3.linux内核源码:内存管理——内存分配和释放关键函数分析&ZGC垃圾回收
4.如何评价java11?
5.OpenJDK17-JVM 源码阅读 - ZGC - 并发标记 | 京东物流技术团队
如何评价jdk11?
从年Oracle收购Sun公司起,JDK的更新速度显著加快,但这也给Java开发人员带来了不小的压力。然而,根据《 年Java生态系统状况报告》,主流的2019如意影视APP源码JDK版本仍然集中在JDK8与JDK上。本文旨在深入探讨JDK的特性,不涉及JDK8的新特性讲解。让我们开始探索JDK带来的新功能,使用时请在集成开发环境中配置为Jdk。
在JDK中,变量定义方式出现了一些有趣的变化,与某些脚本语言的定义方式类似。需要注意的是,尽管Java作为强类型语言,变量定义在编译时要求严格,例如初始化以及成员变量的定义,有其特定的规则。在循环中使用变量时,也需要遵循特定的规范。
JDK支持源文件直接运行,无需执行javac命令,简化了开发流程。FileInputStream的增强,提供了一个快速文件复制方法,使文件操作更加便捷。Files类引入了静态方法readString()与writeString(),方便文件内容的快速读写。
在JDK中,String类增加了isBlank()、strip(), stripLeading(), stripTrailing()等方法,增强了字符串处理的灵活性。针对单列与双列集合的增强,提供了快速复制方法copy()等,优化了集合操作。Stream功能扩展,新增了takeWhile()与dropWhile()方法,易语言接口源码提供了更灵活的流处理能力。
Java 引入了全新的垃圾收集器——ZGC,旨在支持TB级内存容量,具有极低的暂停时间,并对整个程序吞吐量的影响小于%。ZGC设计目标包括支持多层堆、压缩堆等特性,并且在进行对象转移时,仅修改对象指针的几个标志位,相较于G1垃圾收集器,速度更快,但不支持指针压缩。ZGC内存区域被划分为小页面(2M)、中页面(M)与大页面(2的n次方),与G1的个region(每个为2M/4M/8M)不同。
本文对JDK的常用新特性进行了简单介绍,如需更多详细信息或获取JDK新特性及安装包,请在评论区留言。最后,分享一套从零基础到项目实战的JavaWeb视频教程,以及海量Java学习资料包(教程+源码+学习笔记+工具+课件+面试题解析)的免费领取方式,请后台回复:Java。
Java程序员必备基础:JDK 5-都有哪些经典新特性
JDK 发布啦~ 我们一起回顾JDK 5- 的新特性吧,大家一起学习哈~
Java 5 新特性
1. 泛型:本质是参数化类型,解决不确定具体对象类型的问题。
2. 增强循环(for-each):简化了集合的遍历。
3. 自动封箱拆箱:包装类型有:Integer,Double,Float,Long,Short,Character和Boolean
4. 枚举:关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用,这就是枚举类型。
5. 可变参数:我们在定义方法参数的时候不确定定义多少个,就可以定义为「可变参数」,它本质上是一个「数组」。
6. 注解:可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,html红包框架源码并执行相应的处理。
7. 静态导入:通过import static类,就可以使用类里的静态变量或方法。
8. 线程并发库(JUC):JDK5 丰富了线程处理功能,java.util.concurrent包提供了以下的类、接口:
Java 6 新特性
1. Desktop类和SystemTray类:JDK 6在java.awt包下,新增了两个类。
2. 使用JAXB2来实现对象与XML之间的映射:JAXB,即Java Architecture for XML Binding,可以实现对象与XML之间的映射。
3. 轻量级 Http Server API:JDK 6中提供了简单的Http Server API,可以构建嵌入式Http服务器。
4. 插入式注解处理API:JDK 6提供了插入式注解处理API,可以让我们定义的注解在编译期而不是运行期生效。
5. STAX:STAX,是JDK6中一种处理XML文档的API。
6. Common Annotations:Common annotations原本是Java EE 5.0(JSR )规范的一部分。
7. Compiler API:javac编译器可以把.java的源文件编译为.class文件。
8. 对脚本语言的支持(如: ruby, groovy, javascript):JDK6增加了对脚本语言的支持。
Java 7 新特性
1. switch 支持String字符串类型。
2. try-with-resources,资源自动关闭
3. 整数类型如(byte,short,int,long)能够用二进制来表示
4. 数字常量支持下划线
5. 泛型实例化类型自动推断,即”<>”
6. 一个catch中捕获多个异常类型,用(|)分隔开
7. 增强的文件系统
8. Fork/join 框架
Java 8 新特性
1. lambada表达式
2. 函数式接口
3. 方法引用
4. 默认方法
5. Stream API
6. Optional
7. Date Time API
8. 重复注解
9. Base
. JVM的新特性
Java 9 新特性
1. java模块系统
2. 不可变集合工厂方法
3. 接口支持私有方法
4. 钻石操作符升级
5. Optional 类改进
6. 多版本兼容Jar包
7. JShell工具
8. try-with-resources的改进
9. Stream API的改进
Java 新特性
1. 局部变量类型推断
2. 不可变集合的改进
3. 并行全垃圾回收器 G1
4. 线程本地握手
5. Optional新增orElseThrow()方法
6. 其他新特性
Java 新特性
1. 字符串操作
2. 用于 Lambda 参数的局部变量语法
3. 标准化HTTP Client
4. 单个命令编译运行源代码
5. ZGC:可伸缩低延迟垃圾收集器
6. 其他一些特性
Java 新特性
1. Switch 表达式扩展(预览功能)
2. 紧凑的数据格式
3. 字符串支持transform、indent操作
4. Files.mismatch(Path, Path)
5. Teeing Collector
6. 其他特性
Java 新特性
1. Switch 表达式扩展(引入 yield 关键字)
2. 文本块升级
3. SocketAPI 重构
4. FileSystems.newFileSystem新方法
5. 增强 ZGC 释放未使用内存
6. 其他特性
Java 新特性
1. instanceof模式匹配
2. Record 类型(预览功能)
3. Switch 表达式-标准化
4. 改进 NullPointerExceptions提示信息
5. 其他特性
Java 新特性
1. EdDSA 数字签名算法
2. Sealed Classes(封闭类,预览)
3. Hidden Classes(隐藏类)
4. Remove the Nashorn JavaScript Engine
5. Reimplement the Legacy DatagramSocket API(重新实现DatagramSocket API)
6. 其他参考与感谢
linux内核源码:内存管理——内存分配和释放关键函数分析&ZGC垃圾回收
本文深入剖析了Linux内核源码中的内存管理机制,重点关注内存分配与释放的关键函数,通过分析4.9版本的源码,详细介绍了slab算法及其核心代码实现。在内存管理中,slab算法通过kmem_cache结构体进行管理,利用数组的形式统一处理所有的kmem_cache实例,通过size_index数组实现对象大小与kmem_cache结构体之间的映射,从而实现高效内存分配。其中,关键的绿箭头指标源码计算方法是通过查找输入参数的最高有效位序号,这与常规的0起始序号不同,从1开始计数。
在找到合适的kmem_cache实例后,下一步是通过数组缓存(array_cache)获取或填充slab对象。若缓存中有可用对象,则直接从缓存分配;若缓存已空,会调用cache_alloc_refill函数从三个slabs(free/partial/full)中查找并填充可用对象至缓存。在对象分配过程中,array_cache结构体发挥了关键作用,它不仅简化了内存管理,还优化了内存使用效率。
对象释放流程与分配流程类似,涉及数组缓存的管理和slab对象的回收。在cache_alloc_refill函数中,关键操作是检查slab_partial和slab_free队列,寻找空闲的对象以供释放。整个过程确保了内存资源的高效利用,避免了资源浪费。
总结内存操作函数概览,栈与堆的区别是显而易见的。栈主要存储函数调用参数、局部变量等,而堆用于存放new出来的对象实例、全局变量、静态变量等。由于堆的动态分配特性,它无法像栈一样精准预测内存使用情况,导致内存碎片问题。为了应对这一挑战,Linux内核引入了buddy和slab等内存管理算法,以提高内存分配效率和减少碎片。
然而,即便使用了高效的内存管理算法,内存碎片问题仍难以彻底解决。在C/C++中,没有像Java那样的乡镇平台源码自动垃圾回收机制,导致程序员需要手动管理内存分配与释放。如果忘记释放内存,将导致资源泄漏,影响系统性能。为此,业界开发了如ZGC和Shenandoah等垃圾回收算法,以提高内存管理效率和减少内存碎片。
ZGC算法通过分页策略对内存进行管理,并利用“初始标记”阶段识别GC根节点(如线程栈变量、静态变量等),并查找这些节点引用的直接对象。此阶段采用“stop the world”(STW)策略暂停所有线程,确保标记过程的准确性。接着,通过“并发标记”阶段识别间接引用的对象,并利用多个GC线程与业务线程协作提高效率。在这一过程中,ZGC采用“三色标记”法和“remember set”机制来避免误回收正常引用的对象,确保内存管理的精准性。
接下来,ZGC通过“复制算法”实现内存回收,将正常引用的对象复制到新页面,将旧页面的数据擦除,从而实现内存的高效管理。此外,通过“初始转移”和“并发转移”阶段进一步优化内存管理过程。最后,在“对象重定位”阶段,完成引用关系的更新,确保内存管理过程的完整性和一致性。
通过实测,ZGC算法在各个阶段展现出高效的内存管理能力,尤其是标记阶段的效率,使得系统能够在保证性能的同时,有效地管理内存资源。总之,内存管理是系统性能的关键因素,Linux内核通过先进的算法和策略,实现了高效、灵活的内存管理,为现代操作系统提供稳定、可靠的服务。
如何评价java?
JDK作为LTS长期支持版本,将在未来几年内像JDK8一样获得广泛使用,因为下一个LTS版本预计要等到JDK发布后三年。从JDK继承了JDK9、JDK的大量特性,尽管对初级开发者来说语法层面的改进不多,但Java一贯的保守风格并非贬义。
最大的变化在于JDK9引入的模块化,同时兼容非模块化的工程。在语法层面,加入了几乎所有现代语言都有的“var”特性,并保守地没有引入“val”。
本次版本更新是Java历史上规模最大的瘦身行动,移除了Demos and Samples、不常用的GC搭配、jhat、javah、JavaEE、JavaFX(体积较大,自带浏览器内核)、VisualVM、MissionControl等。这些移除都是因为现代已有更好的替代品或独立出去,以加快更新迭代。
瘦身后的安装包体积较JDK9/大幅缩减,甚至比JDK8还小。现在不再单独发布JRE、Server JRE等小体积版本,传统分离的JRE和JDK已合并,Java的编译部分已视为运行时的一部分。不再推出位版本,鉴于位市场的缩小,继续使用位JDK只能选择JDK8。至于ARM平台的JDK,目前似乎不再公开发布。
版本合并和精简瘦身之后,Oracle的JDK和OpenJDK的差异缩小,可替代性增强。在GC方面,G1已成为默认选项,相较于JDK8有所改进,但不是很大。更多关注的是新出的ZGC,虽然它在某些方面表现出色,如停顿时间极短,不受堆大小影响,特别适合对停顿敏感和大堆应用。然而,ZGC的GC性能(吞吐量)较低,在小堆情况下尤为明显,相较于CMS和G1的时间分别是1.6倍左右和1.1倍时间。ZGC不支持分代和压缩指针,对于新生代垃圾较多的情况,优势不大。
在AOT( Ahead-Of-Time)方面,虽然提供了不少支持,但对服务器开发意义不大,因为AOT优化能力理论上不会超越JIT。AOT的主要优点是启动速度快,适合频繁启动的短生命期程序,如shell命令。同时,AOT也会显著加大反编译的难度,对客户端运行闭源应用或交付给只有使用权的客户具有一定的价值。
模块化方面,对习惯于JDK开发的人来说,现阶段模块化的优势并不明显。从体积减小的角度看,JRE本身的大小在现代应用中不算什么。安装目录中新增了jmods目录,包含约MB的jmod压缩包,占据了JDK安装包接近一半的体积。jmod文件实质上是将JRE进行裁剪分割,包括可执行程序和class文件。最基础的jmod为java.base.jmod,包含了JVM的核心。
如果移除jmods和多MB的源码压缩包,JDK安装包体积将不到MB,使用7z可以压缩到约MB,包括完整的JRE(含编译功能),可以说相当瘦身。同时,之前的rt.jar和tools.jar已被替换为modules和ct.sym文件,估计是为了优化整合class文件结构,使其加载更快,同时也利于压缩。
关于许可证问题,对于大多数普通开发者而言,并不需要过于担心,转用OpenJDK也相对简单。只需确保不对Java/JVM本身进行重大改动。Oracle提供的安装包非常方便。
总结而言,JDK在瘦身、GC改进、模块化、AOT支持等方面进行了一系列更新,旨在优化性能、提升用户体验。开发者可以根据自身需求选择适合的GC选项,如对于对停顿要求极端苛刻的情况和超大堆应用,推荐使用ZGC。而对于较小的堆,ParrellelGC或CMS(尽管预计后续版本中CMS可能会被移除)仍然是较好的选择。模块化功能虽有改进,但目前的实用性可能有限。AOT支持提供了启动速度的提升,但对服务器开发的意义相对较小。总体来说,JDK在提高性能、减小体积、优化用户界面等方面做出了显著改进。
OpenJDK-JVM 源码阅读 - ZGC - 并发标记 | 京东物流技术团队
ZGC简介:
ZGC是Java垃圾回收器的前沿技术,支持低延迟、大容量堆、染色指针、读屏障等特性,自JDK起作为试验特性,JDK起支持Windows,JDK正式投入生产使用。在JDK中已实现分代收集,预计不久将发布,性能将更优秀。
ZGC特征:
1. 低延迟
2. 大容量堆
3. 染色指针
4. 读屏障
并发标记过程:
ZGC并发标记主要分为三个阶段:初始标记、并发标记/重映射、重分配。本篇主要分析并发标记/重映射部分源代码。
入口与并发标记:
整个ZGC源码入口是ZDriver::gc函数,其中concurrent()是一个宏定义。并发标记函数是concurrent_mark。
并发标记流程:
从ZHeap::heap()进入mark函数,使用任务框架执行任务逻辑在ZMarkTask里,具体执行函数是work。工作逻辑循环从标记条带中取出数据,直到取完或时间到。此循环即为ZGC三色标记主循环。之后进入drain函数,从栈中取出指针进行标记,直到栈排空。标记过程包括从栈取数据,标记和递归标记。
标记与迭代:
标记过程涉及对象迭代遍历。标记流程中,ZGC通过map存储对象地址的finalizable和inc_live信息。map大小约为堆中对象对齐大小的二分之一。接着通过oop_iterate函数对对象中的指针进行迭代,使用ZMarkBarrierOopClosure作为读屏障,实现了指针自愈和防止漏标。
读屏障细节:
ZMarkBarrierOopClosure函数在标记非静态成员变量的指针时触发读屏障。慢路径处理和指针自愈是核心逻辑,慢路径标记指针,快速路径通过cas操作修复坏指针,并重新标记。
重映射过程:
读屏障触发标记后,对象被推入栈中,下次标记循环时取出。ZGC并发标记流程至此结束。
问题回顾:
本文解答了ZGC如何标记指针、三色标记过程、如何防止漏标、指针自愈和并发重映射过程的问题。
扩展思考:
ZGC在指针上标记,当回收某个region时,如何得知对象是否存活?答案需要结合标记阶段和重分配阶段的代码。
结束语:
本文深入分析了ZGC并发标记的源码细节,对您有启发或帮助的话,请多多点赞支持。作者:京东物流 刘家存,来源:京东云开发者社区 自猿其说 Tech。转载请注明来源。