程序员从宏观、微观角度浅析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的数据类型问题总结
一 JS中有哪些数据类型? -- 共 6 种数据类型,其中 5 种基本数据类型Undefined,Null,Boolean,Number和 String,1 种复杂数据类型Object.因为EC ...
- Struts2(一)---struts2的环境搭建及实例
刚刚接触struts2,有点懵懵懂懂,还是习惯于先写代码,然后慢慢来理解其中的思想. 这篇文章主要内容是strusts的环境搭建及通过一个简单的例子来理解到底是怎么使用struts来简化编程的. 1. ...
- 使用jekyll和Github搭建个人博客
一.使用jekyll和Github三步搭建个人博客 在 Github 上建一个库,库的名字是xxx.github.com,其中的xxx是你的github的账号名(图中标注的不要勾选) 注:如果没有Gi ...
- Win7 系统记事本乱码及cmd闪退解决办法
打开控制面板,点击时钟.语言和区域 中文(简体)改为英语(英国),然后重启电脑,重启电脑之后,继续此操作,在把英语(英国)改为中文(简体),再次重启电脑,就OK了.
- Dubbo中服务消费者和服务提供者之间的请求和响应过程
服务提供者初始化完成之后,对外暴露Exporter.服务消费者初始化完成之后,得到的是Proxy代理,方法调用的时候就是调用代理. 服务消费者经过初始化之后,得到的是一个动态代理类,InvokerIn ...
- .net core下使用Thrift
因网站组(.net)与游戏服务端(c++)原来使用REST API通讯效率稍显低下,准备下期重构时改用rpc方式,经比较Thrift和gRPC两者的优劣(参照网上的对比结果),最终决定使用Thrift ...
- 【最小生成树】UVA1494Qin Shi Huang's National Road System秦始皇修路
Description During the Warring States Period of ancient China(476 BC to 221 BC), there were seven ki ...
- LOJ_6045_「雅礼集训 2017 Day8」价 _最小割
LOJ_6045_「雅礼集训 2017 Day8」价 _最小割 描述: 有$n$种减肥药,$n$种药材,每种减肥药有一些对应的药材和一个收益. 假设选择吃下$K$种减肥药,那么需要这$K$种减肥药包含 ...
- Django 项目搭建(ubuntu系统)
1 环境搭建 sudo apt-get install python3-pip 安装pip3 sudo pip3 install virtualenv 安装虚拟环境,这里展示virtualenv vi ...
- CentOS7 安装Redis Cluster集群
上一篇中已经讲到了如何安装单击版Redis,这一篇我们来说下如何安装Cluster,关于哨兵模式这里我就不写文章安装了,有兴趣的同学可以自己去研究,哨兵模式可以在主从模式下在创建三台机器的哨兵集群监控 ...