程序员从宏观、微观角度浅析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 很多特性出现的原因和解决的问题.初学者可以通过 ...
随机推荐
- 一起来读Netty In Action(一)
Netty是一款异步事件驱动的网络应用程序框架,支持快速的开发可维护的高性能的面向协议的服务器和客户端.在网络编程中,阻塞.非阻塞.同步.异步经常被提到.同步(synchronous) IO和异步(a ...
- Java基础之抽象类
/* 1.抽象类的概述: 动物不应该定义为具体的东西,而且动物中的吃,睡等也不应该是具体的. 我们把一个不是具体的功能称为抽象的功能,而一个类中如果有抽象的功能,该类必须是抽象类. 抽象类的特点: A ...
- poj~1236 Network of Schools 强连通入门题
一些学校连接到计算机网络.这些学校之间已经达成了协议: 每所学校都有一份分发软件的学校名单("接收学校"). 请注意,如果B在学校A的分发名单中,则A不一定出现在学校B的名单中您需 ...
- css 模拟radio的样式
1.input 默认的 type 为 radio的样式,在具体场合中的改造 默认的样式这样: 但是我要这样的: 这样看来是不是比原来的好看多了. 2.优化radio的样式 <span class ...
- volume_manager.go
package ) type) ],,) ,) vms.CanCreateVolume = false } else { vms.Can ...
- BZOJ_1954_Pku3764 The xor-longest Path_Trie树
Description 给定一棵n个点的带权树,求树上最长的异或和路径 把根到点路径上点权异或和求出来,然后变成了Trie树裸题. 代码: #include <cstdio> #inc ...
- appium----【已解决】【Mac】ANDROID_HOME的环境变量配置
在搭建appium的环境时,提示Android_home的环境没有配置,经过一会的奋战终于解决,再次记录下解决方式. 1.安装android-sdk-macosx 下载路径:http://down.t ...
- java一个大接口拆用多线程方式拆分成多个小接口
问题引入 目的:我们的接口A 分别调用了a1 a2 a3 三个接口,最终返回值是 a1的返回值+a2的返回值+a3的返回值 如果同步执行 a1 a2 a3 然后结果相加 很慢 . 如果异步执行 无法 ...
- [转载]学习Javascript闭包(Closure)
学习Javascript闭包(Closure) 源地址: http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures ...
- java游戏开发杂谈 - java编程怎么学
java语言包含很多的知识点,我们并不需要把java语言的知识点都学全了,才开始编程. 你只需要了解: 1,java的数据类型和变量定义 2,类和对象的初步印象. 3,if-else, wh ...