程序员从宏观、微观角度浅析JVM虚拟机!
1.问题
- 1、JAVA文本文件如何被翻译成CLASS二进制文件?
- 2、如何理解CLASS文件的组成结构?
- 3、虚拟机如何加载使用类文件的生命周期?
- 4、虚拟机系列诊断工具如何使用?
- 5、虚拟机内存淘汰机制?
- 6、虚拟机指令集架构?
2.关键词
3.全文概要
4.CLASS文件结构分析
4.1 CLASS文件示例
4.2 class文件结构说明
- 基础字段:用于描述数字,引用,数值或字符串的无符号数,类型为u1,u2,u4,u8表示占用字节数
- 表:只有一行的可变列数的表结构,每个字段可以是基础字段或其他表的索引
4.2.1 魔数
4.2.2 版本数
- 次版本号:前两个字段0x0000
- 主版本号:后两个字段0x0035,转换十进制为53,对应jdk1.9
4.2.3 常量池
- 字面量:字符串,常量
- 引用符合:类/接口全限定名,字段/方法名称和修饰符
4.2.4 访问标志
4.2.5 类/父类/接口索引集合
4.5.6 字段表集合
4.5.7 方法表集合
4.5.8 属性表集合
5.类文件生命周期
- 加载:全限定名检索二进制字节流(不止class文件)->读取至方法区->在堆上生成class对应的对象
- 验证:文件格式验证(符合class文件规范)->元数据验证(语义分析)->字节码验证(方法体校验)->符号引用验证。可以用-Xverify:none来跳过类加载验证
- 准备:类变量分配内存设置初值,并未进行赋值操作
- 解析:针对类接口,字段,方法的符合引用进行解析匹配。类解析,接口解析,字段解析,类方法解析,接口方法解析,
- 初始化:执行类构造器
6.虚拟机诊断工具
- 虚拟机进程状况工具:jps -lvm
- 虚拟机统计信息监视工具:jstat -gc pid interval count
- java配置信息工具:jinfo -flag pid
- java内存映像工具:jmap -dump:format=b,file=java.bin pid
- 虚拟机堆转储快照分析工具:jhat file 分析堆转储文件,通过浏览器访问分析文件
- java堆栈跟踪工具:jstack [ option ] vmid
- jconsole
- jvisualvm
7.虚拟机内存淘汰机制
7.1虚拟机内存分布
- 程序计数器:字节码行号指示器,每个线程需要一个程序计数器
- 虚拟机栈:方法执行时创建栈帧(存储局部变量,操作栈,动态链接,方法出口)编译时期就能确定占用空间大小,线程请求的栈深度超过jvm运行深度时抛StackOverflowError,当jvm栈无法申请到空闲内存时抛OutOfMemoryError,通过-Xss,-Xsx来配置初始内存
- 本地方法栈:执行本地方法,如操作系统api接口
- 堆:存放对象的空间,通过-Xmx,-Xms配置堆大小,当堆无法申请到内存时抛OutOfMemoryError
- 方法区:存储类数据,常量,常量池,静态变量,通过MaxPermSize参数配置
- 对象访问:初始化一个对象,其引用存放于栈帧,对象存放于堆内存,对象包含属性信息和该对象父类、接口等类型数据(该类型数据存储在方法区空间,对象拥有类型数据的地址)
7.2内存回收算法
- 对象优先在Eden区分配:
- 新生对象回收策略Minor GC(频繁)
- 老年代对象回收策略Full GC/Major GC(慢)
- 大对象直接进入老年代:
- 长期存货对象进入老年区:
- 动态对象年龄判定:设置Survivor区对象占用一半空间以上的对象进入老年区
7.3内存收集器
- serial收集器:单线程,主要用于client模式
- ParNew收集器:多线程版的serial,主要用于server模式
- Parallel Scavenge收集器:线程可控吞吐量(用户代码时间/用户代码时间+垃圾收集时间),自动调节吞吐量,用户新生代内存区
- Serial Old收集器:老年版本serial
- Parallel Old收集器:老年版本Parallel Scavenge
- CMS(Concurrent Mark Sweep)收集器:停顿时间短,并发收集
- G1收集器:分块标记整理,不产生碎片
8.虚拟机指令集架构(执行引擎)
8.1虚拟机字节码执行引擎
- 栈帧包含:局部变量表,操作数栈,动态连接,方法返回
- 方法调用
- 方法调用字节码指令:invokestatic,invokespecial,invokevirtual,invokeinterface
- 静态分派:静态类型,实际类型,编译器重载时通过参数的静态类型来确定方法的版本。(选方法)
- 动态分派:invokevirtual指令把类方法符号引用解析到不同直接引用上,来确定栈顶的实际对象(选对象)
- 单分派:静态多分派,相同指令有多个方法版本。
- 多分派:动态单分派,方法接受者只能确定唯一一个。
- javac编译器:解析与符号表填充,注解处理,生成字节码
- java语法糖:语法糖有助于代码开发,但是编译后就会解开糖衣,还原到基础语法的class二进制文件
- HotSpot虚拟机内的即时编译
10.总结
程序员从宏观、微观角度浅析JVM虚拟机!的更多相关文章
- 99.9%的Java程序员都说不清的问题:JVM中的对象内存布局?
本文转载自公众号:石彬的架构笔记,阅读大约需要8分钟. 作者:李瑞杰 目前就职于阿里巴巴,资深 JVM 研究人员 在 Java 程序中,我们拥有多种新建对象的方式.除了最为常见的 new 语句之外,我 ...
- Java程序员想年后跳槽,对JVM没有深入的理解,我劝你还是别跳了
前言 Java 虚拟机是学习 Java 的基础,也是迈入高级 Java 开发工程师的必备知识点.所以今天这篇文章我们来聊聊如何从零开始学习 Java 虚拟机. 深入浅出Java虚拟机 对于刚刚接触 J ...
- 从Lumia退役看为什么WP走向没落(从程序员与市场开发的角度,讲的真棒!)
http://www.cnblogs.com/zhangkai2237/p/4856880.html
- 2020年薪30W的Java程序员都要求熟悉JVM与性能调优!
前言 作为Java程序员,你有没有被JVM伤害过?面试的时候是否碰到过对JVM的灵魂拷问? 一.JVM 内存区域划分 1.程序计数器(线程私有) 程序计数器(Program Counter Reg ...
- 2017年 Java 程序员,风光背后的危机
不得不承认,经历过行业的飞速发展期,互联网的整体发展趋于平稳.为什么这么说?为什么要放在 Java 程序员的盘点下说? 的确,对于进可攻前端,后可守后端大本营的 Java 程序员而言,虽然供应逐年上涨 ...
- Java程序员如何在竞争中保持优势
Java程序员入门容易,进阶很难,想要在竞争中保持优势,脚踏实地的同时也要仰望星空规划自己的未来.时间在流逝,年龄在增加,你期望的薪水也在不断增多,你总得让自己能力持续增加以配得上想要的收入吧. 从初 ...
- 《高效能程序员的修炼》读后感 By Yong Zhang
想不到我工作中经常GOOGLE搜寻技术问题的stack overflow网站的创办人竟然是<高效能程序员的修炼>一书的作者!看了一遍全书,果然名不虚传. 本书更多的从人文角度而非技术角度去 ...
- 【Java】Java程序员面试宝典(第三版)第5章----Java程序设计基本概念
1.static静态变量,在次级作用域也可以被修改. 2.k++ + k++.第一个自加实际上只有在与计算+k++时补增.详情P36的题目. 3.Java数据类型从低到高分为(byte short c ...
- 推荐给 Java 程序员的 7 本书
< Java 编程思想> 适合各个阶段 Java 程序员的必备读物.书中对 Java 进行了详尽的介绍,与其它语言做了对比,解释了 Java 很多特性出现的原因和解决的问题.初学者可以通过 ...
随机推荐
- JavaScript设计模式 Item 7 --策略模式Strategy
1.策略模式的定义 何为策略?比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路. 如果没有时间但是不在乎钱,可以选择坐飞机. 如果没有钱,可以选择坐大巴或者火车. 如果再穷一点,可以选 ...
- 模块(相当于Java里的包)
Python提供丰富和强大的标准库和第三方库. sys库 在命令窗口中可以输入参数 若想将参数打印出来, 可以这样写: print(sys.argv[2]) os库 可以创建文件夹. 类似于Java里 ...
- 求第n个丑数
参考http://www.cppblog.com/zenliang/articles/131094.html 什么是因子:因子*因子=乘积数如果一个数是丑数,那么这个数是2,3,5的乘积的结果.比如: ...
- index_init_oprions.go
{ options.DocCacheSize = defaultDocCacheSize } }
- 在 Java 中运用动态挂载实现 Bug 的热修复
大多数 JVM 具备 Java 的 HotSwap 特性,大部分开发者认为它仅仅是一个调试工具.利用这一特性,有可能在不重启 Java 进程条件下,改变 Java 方法的实现.典型的例子是使用 IDE ...
- bzoj 3166 可持久化Tire
每一个数能做出的贡献就是其两端第二个比他大的中间的数和他的异或值 按权值大小排序,按照位置扔进set,set内的元素都是比他大的,也是全的 然后Tire上跑就行了.. #include<cstd ...
- BZOJ_2962_序列操作_线段树
Description 有一个长度为n的序列,有三个操作1.I a b c表示将[a,b]这一段区间的元素集体增加c,2.R a b表示将[a,b]区间内所有元素变成相反数,3.Q a b c表示询问 ...
- POJ_2318_TOYS&&POJ_2398_Toy Storage_二分+判断直线和点的位置关系
POJ_2318_TOYS&&POJ_2398_Toy Storage_二分+判断直线和点的位置 Description Calculate the number of toys th ...
- BZOJ_3669_[Noi2014]魔法森林_LCT
BZOJ_3669_[Noi2014]魔法森林_LCT Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节 ...
- jsp 基础知识之指令元素
由于考研和结业的事情,这里荒废了许久,而如今重新捡起来,是因为带到公司的碳素笔没有油了...... jsp的指令元素:通常以<%@开始,以%>结尾. jsp主要包括三种指令元素:pa ...