Java 14 新特性概览
空指针异常精准提示通过 JVM 参数中添加-XX:+ShowCodeDetailsInExceptionMessages,可以在空指针异常中获取更为详细的调用信息,更快的定位和解决问题。
a.b.c.i = 99; // 假设这段代码会发生空指针
Java 14 之前:
Exception in thread "main" java.lang.NullPointerException
at NullPointerExample.main(NullPointerExample.java:5)
Java 14 之后:
// 增加参数后提示的异常中很明确的告知了哪里为空导致
Exception in thread "main" java.lang.NullPointerException:
Cannot read field 'c' because 'a.b' is null.
at Prog.main(Prog.java:5)
switch 的增强(转正)Java12 引入的 s ...
Java 12 ~ 13 新特性概览
Java12String 增强Java 11 增加了两个的字符串处理方法,如以下所示。
indent() 方法可以实现字符串缩进。
String text = "Java";
// 缩进 4 格
text = text.indent(4);
System.out.println(text);
text = text.indent(-10);
System.out.println(text);
输出:
Java
Java
transform() 方法可以用来转变指定字符串。
String result = "foo".transform(input -> input + " bar");
System.out.println(result); // foo bar
Files 增强(文件比较)Java 12 添加了以下方法来比较两个文件:
public static long mismatch(Path path, Path path2) throws IOException
mismatch() 方法用 ...
Java 11 新特性概览
Java 11 于 2018 年 9 月 25 日正式发布,这是很重要的一个版本!Java 11 和 2017 年 9 月份发布的 Java 9 以及 2018 年 3 月份发布的 Java 10 相比,其最大的区别就是:在长期支持(Long-Term-Support)方面,Oracle 表示会对 Java 11 提供大力支持,这一支持将会持续至 2026 年 9 月。这是据 Java 8 以后支持的首个长期版本。
下面这张图是 Oracle 官方给出的 Oracle JDK 支持的时间线。
概览(精选了一部分) :
JEP 321:HTTP Client 标准化
JEP 333:ZGC(可伸缩低延迟垃圾收集器)
JEP 323:Lambda 参数的局部变量语法
JEP 330:启动单文件源代码程序
HTTP Client 标准化Java 11 对 Java 9 中引入并在 Java 10 中进行了更新的 Http Client API 进行了标准化,在前两个版本中进行孵化的同时,Http Client 几乎被完全重写,并且现在完全支持异步非阻塞。
并且,Java 11 中,Ht ...
Java 10 新特性概览
Java 10 发布于 2018 年 3 月 20 日,最知名的特性应该是 var 关键字(局部变量类型推断)的引入了,其他还有垃圾收集器改善、GC 改进、性能提升、线程管控等一批新特性。
概览(精选了一部分) :
JEP 286:局部变量类型推断
JEP 304:垃圾回收器接口
JEP 307:G1 并行 Full GC
JEP 310:应用程序类数据共享(扩展 CDS 功能)
JEP 317:实验性的基于 Java 的 JIT 编译器
局部变量类型推断(var)由于太多 Java 开发者希望 Java 中引入局部变量推断,于是 Java 10 的时候它来了,也算是众望所归了!
Java 10 提供了 var 关键字声明局部变量。
var id = 0;
var codefx = new URL("https://mp.weixin.qq.com/");
var list = new ArrayList<>();
var list = List.of(1, 2, 3);
var map = new HashMap<String, String ...
Java 内存区域详解(重点)
如果没有特殊说明,都是针对的是 HotSpot 虚拟机。
本文基于《深入理解 Java 虚拟机:JVM 高级特性与最佳实践》进行总结补充。
常见面试题 :
介绍下 Java 内存区域(运行时数据区)
Java 对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么)
对象的访问定位的两种方式(句柄和直接指针两种方式)
前言对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像 C/C++程序开发程序员这样为每一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序员把内存控制权利交给 Java 虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。
运行时数据区域Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。JDK 1.8 和之前的版本略有不同,下面会介绍到。
JDK 1.8 之前 :
JDK 1.8 之后 :
线程私有的:
程序计数器
虚拟机栈
本地方法栈
线程 ...
最重要的 JVM 参数总结
本文由 JavaGuide 翻译自 https://www.baeldung.com/jvm-parameters,并对文章进行了大量的完善补充。
JDK 版本:1.8
1.概述在本篇文章中,你将掌握最常用的 JVM 参数配置。
2.堆内存相关
Java 虚拟机所管理的内存中最大的一块,Java 堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。
2.1.显式指定堆内存–Xms和-Xmx与性能有关的最常见实践之一是根据应用程序要求初始化堆内存。如果我们需要指定最小和最大堆大小(推荐显示指定大小),以下参数可以帮助你实现:
-Xms<heap size>[unit]
-Xmx<heap size>[unit]
heap size 表示要初始化内存的具体大小。
unit 表示要初始化内存的单位。单位为**“ g”** (GB) 、**“ m”(MB)、“ k”**(KB)。
举个栗子 🌰,如果我们要为 JVM 分配最小 2 GB 和最大 5 GB 的堆内存大小,我们的 ...
大白话带你认识 JVM
来自说出你的愿望吧丷投稿,原文地址:https://juejin.im/post/5e1505d0f265da5d5d744050 。
前言如果在文中用词或者理解方面出现问题,欢迎指出。此文旨在提及而不深究,但会尽量效率地把知识点都抛出来
一、JVM 的基本介绍JVM 是 Java Virtual Machine 的缩写,它是一个虚构出来的计算机,一种规范。通过在实际的计算机上仿真模拟各类计算机功能实现···
好,其实抛开这么专业的句子不说,就知道 JVM 其实就类似于一台小电脑运行在 windows 或者 linux 这些操作系统环境下即可。它直接和操作系统进行交互,与硬件不直接交互,而操作系统可以帮我们完成和硬件进行交互的工作。
1.1 Java 文件是如何被运行的比如我们现在写了一个 HelloWorld.java 好了,那这个 HelloWorld.java 抛开所有东西不谈,那是不是就类似于一个文本文件,只是这个文本文件它写的都是英文,而且有一定的缩进而已。
那我们的 JVM 是不认识文本文件的,所以它需要一个 编译 ,让其成为一个它会读二进制文件的 HelloWorl ...
JVM 垃圾回收详解(重点)
如果没有特殊说明,都是针对的是 HotSpot 虚拟机。
本文基于《深入理解 Java 虚拟机:JVM 高级特性与最佳实践》进行总结补充。
常见面试题 :
如何判断对象是否死亡(两种方法)。
简单的介绍一下强引用、软引用、弱引用、虚引用(虚引用与软引用和弱引用的区别、使用软引用能带来的好处)。
如何判断一个常量是废弃常量
如何判断一个类是无用的类
垃圾收集有哪些算法,各自的特点?
HotSpot 为什么要分为新生代和老年代?
常见的垃圾回收器有哪些?
介绍一下 CMS,G1 收集器。
Minor Gc 和 Full GC 有什么不同呢?
前言当需要排查各种内存溢出问题、当垃圾收集成为系统达到更高并发的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。
堆空间的基本结构Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时,Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收。
Java 堆是垃圾收集器管理的主要区域,因此也被称作 GC 堆(Garbage Collected Heap)。
从垃圾回收的角度来说,由于现在收集器基本都采用分代 ...
无题
JDK 监控和故障处理工具总结JDK 命令行工具这些命令在 JDK 安装目录下的 bin 目录下:
jps (JVM Process Status): 类似 UNIX 的 ps 命令。用于查看所有 Java 进程的启动类、传入参数和 Java 虚拟机参数等信息;
**jstat**(JVM Statistics Monitoring Tool): 用于收集 HotSpot 虚拟机各方面的运行数据;
jinfo (Configuration Info for Java) : Configuration Info for Java,显示虚拟机配置信息;
jmap (Memory Map for Java) : 生成堆转储快照;
jhat (JVM Heap Dump Browser) : 用于分析 heapdump 文件,它会建立一个 HTTP/HTML 服务器,让用户可以在浏览器上查看分析结果;
jstack (Stack Trace for Java) : 生成虚拟机当前时刻的线程快照,线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合。
jps:查看所有 Ja ...
类加载器详解(重点)
回顾一下类加载过程开始介绍类加载器和双亲委派模型之前,简单回顾一下类加载过程。
类加载过程:加载->连接->初始化。
连接过程又可分为三步:验证->准备->解析。
加载是类加载过程的第一步,主要完成下面 3 件事情:
通过全类名获取定义此类的二进制字节流
将字节流所代表的静态存储结构转换为方法区的运行时数据结构
在内存中生成一个代表该类的 Class 对象,作为方法区这些数据的访问入口
类加载器类加载器介绍类加载器从 JDK 1.0 就出现了,最初只是为了满足 Java Applet(已经被淘汰) 的需要。后来,慢慢成为 Java 程序中的一个重要组成部分,赋予了 Java 类可以被动态加载到 JVM 中并执行的能力。
根据官方 API 文档的介绍:
A class loader is an object that is responsible for loading classes. The class ClassLoader is an abstract class. Given the binary name of a class, a cla ...