JVM-Java语法糖
参考文献
不了解这12个语法糖,别说你会Java!
语法糖
语法糖的存在主要是方便开发人员使用,Java虚拟机并不支持这些语法糖。这些语法糖在编译阶段就会被还原成简单的基础语法结构,这个过程就是解语法糖
Java支持的语法糖
switch 支持 String 与枚举
对于编译器来说,switch中其实只能使用整型,任何类型的比较都要转换成整型。比如byte。short,char(ackii码是整型)以及int
泛型
通常情况下,一个编译器处理泛型有两种方式:Code specialization和Code sharing。
C++和C#是使用Code specialization的处理机制,而Java使用的是Code sharing的机制。
Code sharing方式为每个泛型类型创建唯一的字节码表示,并且将该泛型类型的实例都映射到这个唯一的字节码表示上。将多种泛型类形实例映射到唯一的字节码表示是通过类型擦除(type erasue)实现的。
也就是说,对于Java虚拟机来说,他根本不认识Map<String, String> map这样的语法。需要在编译阶 ...
JVM(八)-异常处理
参考文献
极客时间-JVM是如何处理异常的?
异常处理
异常处理的两大组成要素是抛出异常和捕获异常.这两大要素共同实现程序控制流的非正常转移.
抛出异常可分为显式和隐式两种.显式抛异常的主体是应用程序,它指的是在程序中使用throw关键字,手动将异常实例抛出.
隐式抛异常的主体则是 Java 虚拟机,它指的是 Java 虚拟机在执行过程中,碰到无法继续执行的异常状态,自动抛出异常.举例来说,Java 虚拟机在执行读取数组操作时,发现输入的索引值是负数,故而抛出数组索引越界异常(ArrayIndexOutOfBoundsException).
捕获异常则涉及了如下三种代码块:
try 代码块:用来标记需要进行异常监控的代码.
catch 代码块:跟在 try 代码块之后,用来捕获在 try 代码块中触发的某种指定类型的异常.除了声明所捕获异常的类型之外,catch 代码块还定义了针对该异常类型的异常处理器.在 Java 中,try 代码块后面可以跟着多个 catch 代码块,来捕获不同类型的异常.Java 虚拟机会从上至下匹配异常处理器.因此,前面的 catch 代码块所捕获的异 ...
JVM(七)-静态绑定和动态绑定
参考文献
极客时间-JVM是如何执行方法调用的?(上)
静态绑定和动态绑定
静态绑定: 所有依赖静态类型来定位方法执行版本的分派方式.如: 重载方法.
静态绑定(也称为早期绑定)是指在编译时进行的方法绑定.在静态绑定中,方法调用的具体实现在编译时已经确定,因此它是基于引用类型而不是基于运行时对象类型的.这意味着,如果调用的方法是在父类中定义的,则不管实际运行时类型是什么,该方法都将被调用.
动态绑定: 根据运行的时机类型来定位方法执行版本的分派方式.如: 重写方法.
动态绑定(也称为晚期绑定或运行时绑定)是指在运行时进行的方法绑定.在动态绑定中,方法调用的具体实现是在运行时根据实际对象类型确定的,因此它是基于运行时对象类型的.
Java 虚拟机识别方法的关键在于类名,方法名以及方法描述符(method descriptor).
方法描述符: 它是由方法的参数类型以及返回类型所构成.在同一个类中,如果同时出现多个名字相同且描述符也相同的方法,那么 Java 虚拟机会在类的验证阶段报错.
Java 虚拟机中关于方法重写的判定同样基于方法描述符.也就是说,如果 ...
JVM-线程堆栈等数据分析
参考文献
JVM线程模型
线程创建和销毁
在语言层面,线程对应的类是java.lang.Thread,启动方法为Thread#start()。
在Java线程启动时会创建底层线程(native Thread,在任务执行完成后会自动回收。
JVM中所有线程都交给操作系统来负责调度,以将线程分配到可用的 CPU 上执行
线程状态
从 JVM的角度看,线程状态主要包括 4 种:
_thread_new:正在初始化的新线程
_thread_in_Java:正在执行 Java 代码的线程
_thread_in_vm:在 JVM 内部执行的线程
_thread_blocked:由于某种原因被阻塞的线程(例如获取锁、等待条件、休眠、执行阻塞的 I/O 操作等等)
JVM内部线程
JVM 内部线程主要分为以下几种:
VM 线程: 单例的VMThread对象,负责执行 VM 操作,下文将对此进行讨论;
定时任务线程: 单例的WatcherThread对象,模拟在 VM 中执行定时操作的计时器中断;
GC 线程: 垃圾收集器中,用于支持并行和并发垃圾回收的线程;
编译器线程: 将字节码 ...
JVM-参数设置说明
参考文献
Guide to the Most Important JVM Parameters
Java HotSpot VM Options
Tuning JVM Garbage Collection for Production Deployments
Convert GC Logging Flags to Xlog
The java Command
JVM GC配置指南
Java容器化参数配置最佳实践
JVM参数说明
123java [options] classname [args]java [options] -jar filename [args]
[options] 部分称为JVM 选项,对应 IDE 中的 VM options, 可用 jps -v 查看.
[args] 部分是指传给main函数的参数, 对应 IDE 中的 Program arguments, 可用 jps -m 查看.
Java 和 JDK 内置的工具,指定参数时都是一个 -,不管是长参数还是短参数.有时候,JVM 启动参数和 Java 程序启动参数,并没必 ...
JVM(六)-类加载
参考文献
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)
JVM 基础 - Java 类加载机制
虚拟机类加载机制
Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制.
在Java语言中,类型的加载,连接和初始化过程都是在程序运行期间完成的.
类的生命周期
一个类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将经历**加载(Loading),验证(Verification),准备(Preparation),解析(Resolution),初始化(Initialization),使用(Using)和卸载(Unloading)**七个阶段.
其中验证,准备,解析三个阶段被统称为连接(Linking).
其中前五个部分(加载,验证,这边,解析,初始化)统称为类加载.
类加载的过程
Loading 加载
加载阶段是整个类加载(Class Loading)过程的一个阶段,在加载阶段,Java虚拟机需要完成以下三件事情:
通过类的 ...
JVM-类文件结构
参考文献
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)
类文件结构
类型
名称
中文名称
数量
u4
magic
魔数
1
u2
minor_version
主版本号
1
u2
major_version
副版本号
1
u2
constant_pool_count
常量池计数器
1
cp_info
constant_pool
常量池
constant_pool_count-1
u2
access_flags
某个类或者接口的访问权限和属性
1
u2
this_class
类索引
1
u2
super_class
父类索引
1
u2
interfaces_count
接口计数器
1
u2
interfaces
接口表
interfaces_count
u2
fields_count
字段计数器
1
fields_info
fields
字段表
fields_count
u2
methods_count
方法计数器
1
method_info
methods
方法表
methods_count
u2
a ...
JVM(四)-虚拟机性能监控和故障处理工具
参考文献
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)
JDK Tools and Utilities
How to Analyze Java Thread Dumps
基础故障处理工具
工具
简介
java
Java 应用的启动程序
javac
JDK 内置的编译工具
javap
反编译 class 文件的工具
javadoc
根据 Java 代码和标准注释,自动生成相关的 API 说明文档
javah
JNI 开发时,根据 Java 代码生成需要的 .h 文件.
extcheck
检查某个 jar 文件和运行时扩展 jar 有没有版本冲突,很少使用
jdb
Java Debugger 可以调试本地和远端程序,属于 JPDA 中的一个 Demo 实现,供其他调试器参考.开发时很少使用
jdeps
探测 class 或 jar 包需要的依赖
jar
打包工具,可以将文件和目录打包成为 .jar 文件;.jar 文件本质上就是 zip 文件,只是后缀不同.使用时按顺序对应好选项和参数即可.
keytool
安全证书和密钥 ...
JVM(三)-垃圾收集器日志分析
参考文献
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)
JEP 158: Unified JVM Logging
Tools Reference
Java HotSpot VM Options
垃圾收集器日志
HotSpot 所有功能的日志都收归到了-Xlog参数
1Xlog[:[selector][:[output][:[decorators][:output-options
命令行中最关键的参数是选择器(Selector),它由标签(Tag)和日志级别 (Level)共同组成.标签可理解为虚拟机中某个功能模块的名字,它告诉日志框架用户希望得到虚拟机哪些功能的日志输出。垃圾收集器的标签名称为“gc”,由此可见,垃圾收集器日志只是 HotSpot 众多功能日志的其中一项,全部支持的功能模块标签名如下所示
12add,age,alloc,annotation,aot,arguments,attach,barrier,biasedlocking,blocks,bot,break point,bytecode
日志级别从低到高,共有Trace,Debug,War ...
JVM-垃圾回收
参考文献
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)
The JVM Write Barrier - Card Marking
Java(JVM) Memory Model - Memory Management in Java
GC Roots
Garbage Collection Roots
Understanding metaspace line in JVM heap printout
[讨论] [HotSpot VM] JVM调优的"标准参数"的各种陷阱
Java中9种常见的CMS GC问题分析与解决
JVM之三色标记算法
概念
内存泄漏: 该释放的没释放,该回收的没回收.
内存溢出: 内存不够用
垃圾回收
哪些内存需要回收?
JVM 的内存区域中,程序计数器、虚拟机栈和本地方法栈这 3 个区域是线程私有的,随着线程的创建而创建,销毁而销毁;栈中的栈帧随着方法的进入和退出进行入栈和出栈操作,每个栈帧中分配多少内存基本是在类结构确定下来的时候就已知的.
垃圾回收的重点就是关注堆和方法区中的内存了,堆中的回收主要是对象的回收,方法区的 ...