程序员从宏观、微观角度浅析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 很多特性出现的原因和解决的问题.初学者可以通过 ...
随机推荐
- Windows10 使用docker toolbox安装docker
一.介绍 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间 ...
- Spider与OpenPyXL的结合
OpenPyXL的API文档 1.OpenPyXL基础操作 引入Workbook这个类,然后调用 from openpyxl import Workbook wb = Workbook() 通过ope ...
- (一)Servlet简介
相关名词解释 HTML:Hyper Text Markup Language,超文本标记语言 HTTP:Hyper Text Transfer Protocol,超文本传输协议 URL:Uniform ...
- Tomcat 优化方案 和 配置详解(转)
转自 Tomcat 优化方案 和 配置详解 http://201605130349.iteye.com/blog/2298985 Server.xml配置文件用于对整个容器进行相关的配置. <S ...
- Java基础-抽象类和接口
抽象类与接口是Java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别. 抽象定义: 抽象 ...
- Charles 如何破解与连接手机进行抓包
破解charles: 由于本人工作原因,现使用的为mac笔记本,但是基本的使用原理都是一样的,以下为如何破解charles与连接手机进行抓包详解.工具如有需要着请留言. 当前下载使用的版本为:char ...
- kali下安装截图软件
安装截图软件 1.下载安装python-xlib apt-get install python-xlib 2.下载截图软件包 wget http://packages.linuxdeepin.com/ ...
- Netty基础系列(1) --linux网路I/O模型
引言 我一直认为对于java的学习,掌握基础的性价比要远远高于使用框架,而基础知识中对于网络相关知识的掌握也是重中之重.对于一个java程序来说,无论是工作中还是面试,对于Netty的掌握都是及其重要 ...
- 全面理解 javascript 的 argements caller callee call apply 之caller
/** * 演示arguments的用法,如何获取实参数和形数数 */ function argTest(a,b,c,d){ var numargs = arguments.length; // 获取 ...
- MySQL 中基于 XA 实现的分布式事务
1 XA协议 首先我们来简要看下分布式事务处理的XA规范可知XA规范中分布式事务有AP,RM,TM组成: 其中应用程序(Application Program ,简称AP):AP定义事务边界(定义事务 ...