深入理解Java虚拟机
Java作为如此受欢迎的语言,拥有大量是使用者。对JVM的了解,有助于写出更优质、更优雅的代码,对一些问题的实质更了然于胸。本系列文章,不同于冗长难懂的大部头和炫技文章,以最直白的语言带你窥探JVM的奥义!
end
这个作者很懒,什么都没留下…
展开
-
深入理解Java虚拟机----(十一)线程安全与锁优化
线程安全 为了深入讨论,不把线程安全当做非真即假的概念,我们把它分为5个层次。不可变:不可变的数据是线程安全的。例如前面提到的final,被final修饰的基础数据类型,被正确构造后,就是不可变的,亦为线程安全的。如果是一个对象,需要保证他的行为不会对状态产生印象,例如String、Integer、Long、Double等,内部值是final的,所以不可变。绝对线程安全:一个原创 2016-02-12 17:05:08 · 1468 阅读 · 0 评论 -
深入理解Java虚拟机----(十)Java内存模型与线程
Java虚拟机规范试图定义一种Java内存模型来消除不同硬件和操作系统的差异。JDK1.5(JSR-133)开始,Java内存模型终于算是开始完善起来。Java内存模型主要是目的是定义程序中可线程共享的变量的访问规则。它规定所有变量都存在主内存,每个线程有自己的工作内存,存储的是使用的变量的主内存拷贝。线程不能直接操作主内存中的变量,互相间也不能访问工作内存。交换、传输数据只能经过主内存。原创 2016-02-12 12:40:35 · 888 阅读 · 0 评论 -
深入理解Java虚拟机----(九)程序编译和代码优化
早期优化 javac把.java文件编译为class文件的这个编译过程,几乎没做什么优化,几乎将优化都放到了后端的即时编译器中,这样是为了其他非javac编译的程序也能享受到优化的待遇。但javac给我们提供了很多便于编程的语法糖,大大的方便了我们。可以说后端优化提高了运行效率,前端优化对于编码更加密切。 javac编译过程可大致分3步:解析与填充符号表插入式注解处原创 2016-02-12 11:53:02 · 2331 阅读 · 1 评论 -
深入理解Java虚拟机----(八)类加载和执行子系统的应用
在上一篇class文件和执行引擎这部分中,用户能参与的部分不是太多。class格式、加载、链接、解释执行都是虚拟机规定的,能通过程序操作的有:类加载器和字节码生成。下面看看几个相关的精彩案例:Tomcat的加载器架构 java web服务器通常有多个自定义类,来解决这些问题不同web项目间的类库隔离不同web项目间类库的共享java编写的服务器本身和项目类库间的隔原创 2016-02-12 11:50:59 · 1604 阅读 · 1 评论 -
深入理解Java虚拟机----(七)字节码执行引擎
执行引擎是最重要的一部分,概念模型的总体外观是一致的:输入自己吗,过程是字节码解析的等效过程,输出结果。不同的虚拟机有不同的具体实现,大体有解释执行和编译执行两种选择。运行时栈帧结构: 栈桢在虚拟机栈中,是支持方法调用和执行的结构。存储局部变量表、操作数栈、动态链接和方法返回地址等。在编译时,需要多大的局部表量表,多深的操作数栈都确定了,所以需要多大内存也确定了。只有处于栈顶原创 2016-02-12 11:49:39 · 2400 阅读 · 1 评论 -
深入理解Java虚拟机----(六)类加载机制
上一篇简单描述的类文件结构只是一种被编译器编译后的一个通用描述。在运行时,虚拟机需要将类文件加载到内存,校验、解析、初始化等一些列操作后,生成可使用的Java类。这一系列过程就是虚拟机的类加载机制。 c++在运行前就有一个链接的过程,而java类型的加载、链接、初始化都是在运行期动态完成的,虽然会慢点,但是提高了灵活性。例如:接口在运行时才知道具体实现;可以运行时从远端下载一段代码运行。原创 2016-02-12 11:47:02 · 1069 阅读 · 0 评论 -
深入理解Java虚拟机----(五)类文件结构
虚拟机不与任何语言绑定,只与字节码这种二进制文件绑定。许多基于jvm的语言,都被编译成固定格式的字节码文件,具有了一致性,然后可以被统一的虚拟机执行。Class文件结构: class结构只有两种数据结构:无符号数:基本数据结构,u1、u2、u4、u8代表1、2、4、8个字节的无符号数。可以描述数字、引用、UTF-8的字符串。表:由无符号数组成的符合类型。整个class文件原创 2016-02-12 11:46:12 · 965 阅读 · 0 评论 -
深入理解Java虚拟机----(四)性能监控与故障处理工具
前面的理论知识是解决问题的基础,经验是催化剂,数据是原料,工具是手段。其中数据包括线程快照、运行日志、GC日志、堆快照、异常堆栈等。下面介绍一下工具。 命令行工具 bin目录中,JDk为我们提供了强大稳定的工具集合,他们都是lib/tool.jar类库的包装。主要有jps : 显示所有虚拟机进程。类似UNIX的ps命令。如果启动了多个虚拟机,通过该命令查询LVMID原创 2016-02-09 22:09:45 · 1442 阅读 · 1 评论 -
深入理解Java虚拟机----(三)内存分配策略和垃圾收集器
垃圾回收: 垃圾回收面临着三个问题:回收什么、什么时候回收、怎么回收。 哪些对象已经不再被需要了,就需要被回收。引用计数法:教科书式解释,每个对象维护对它的引用的个数。但是主流虚拟机不适用,因为难解决循环引用。可达性分析算法:主流适用的算法。虚拟机选定一些GCRoot对象,如果一个对象和GCRoot对象间没有引用链,则这个对象是无用的、可以回收的。可以作为GCRoo原创 2016-02-09 18:45:03 · 1842 阅读 · 0 评论 -
深入理解Java虚拟机----(二)内存区域与内存溢出异常
内存区域: 与c++的由人为的内存管理相比,Java将内存交给了虚拟机来管理。 根据虚拟机规范,内存分为几个区域: 堆:线程共享区域。规范定义存放真正的对象和数组的内存区域。虚拟机大多采用分代收集算法,可以分为新生代老年代。新生代可分为Eden、From Survivor、To Survivor。线程分配角度,可能划分出线程私有的缓冲区域。如果堆内存不够分原创 2016-02-08 22:08:36 · 1372 阅读 · 0 评论 -
深入理解Java虚拟机----(一)走近java
Java技术体系包括:Java程序设计语言Java虚拟机Class文件格式Java API类库第三方库 按照领域划分:Java Card:支持小内存设备的程序J2ME : 移动终端的平台J2SE : 桌面及应用平台J2EE:多级架构的企业级平台 虚拟机有多种实现,在符合规范的前提下,提供了额外的一些优化和功能。使用最为广泛的是HotSpo原创 2016-02-08 22:06:37 · 1104 阅读 · 0 评论