深入JVM内核---原理,诊断与优化
JVM的概念
JAM是Java Virtual Machine的简称。意为Java虚拟机
虚拟机
指通过软件模拟的具有完整硬件系统功能的,运行在一种完整隔离环境中的完整计算机系统
有哪些虚拟机
- VMWare
-Visual Box
-JVM
VMWare或者Visual Box都是使用软件模拟物理CPU的指令集
JVM使用软件模拟Java字节码的指令集
JVM发展史
初始JVM-Java和JVM的历史
1996年SUN JDK1.0Classic VM
-纯解释运行,使用外挂进行JIT
1997年JDK1.1发布
-AWT, 内部类,JDBC,RMI,反射
1998年 JDK1.2 Solaris Exact VM
-JIT 解释器混合
-Accurate Memory Management 精确内存管理,数据类型敏感(JDK1.2后 称为Java 2 J2SE J2EE J2ME的出现加入Swing Collections)
-提升的GC性能
2000年 JDK 1.3 Hotspot 作为默认虚拟机发布 加入JavaSound
2002年 JDK1.4Classic VM退出历史舞台 Assert正则表达式 NIO IPV6 日志API 加密类库等
2004年发布 JDK1.5 即 JDK5,J2SE 5 ,Java 5
-泛型
-注释
-装箱
-枚举
JDK1.6 JDK6
-脚本语言支持
-JDBC4.0
-Java编译器 API
-可变长的参数
-Foreach循环
JDK1.6 JDK6
-脚本语言支持
-JDBC 4.0
-Java编译器API
2011年 JDK7发布
-延误项目推出到JDK8
-G1
-动态语言增强
-64位系统中的压缩指针
-NIO 2.0
2014年 JDK8发布
-Lambda表达式
-语法增强 Java类型注释
2016年JDK9
-模块化
大事记
使用最为广泛的JVM为HotSpot
HotSpot 为Longview Technologies开发 被SUN收购
2006年 Java开源 并建立OpenJDK
-HotSpot 成为Sun JDK和OpenJDK中所带的虚拟机
2008年 Oracle收购BEA
-得到JRockit VM
2010年Oracle 收购 Sun
-得到Hotspot
Oracle虚部JDK8时整合JRockit和Hotspot,优势互补
-在Hotspot基础上,移植JRockit优秀特性
JVM种类
KVM
-Sun发布
IOS Android前,广泛用于手机系统
CDC/CLDC HotSpot
-手机,电子书,PDA等设备上建立统一的Java编程接口
-J2ME的重要组成部分
-BEA
IBM J9 VM
-IBM内部
Apache Harmony
-兼容于1.5和JDK1.6的Java程序运行平台
-与Oracle关系恶劣 退出JCP,Java社区的分裂
-OpenJDK出现后,受到挑战2011年退役
-没有大规模商用经历
对Android的发展有积极的作用
JRockit
Java语言规范
-语法
语法定义
-IfThenStatement
if(Expression)Statement
-ArgumentList;
Argument
ArgumetList,Argument
1.词法结构
- \u+4个进制数字,表示UTF-16
-行终结符:CR,or LF,or CR LF。
Identifier:
IdentifierChars but not a Keyword or BooleanLiteral or NullLiteral
IdentifierChars:
JavaLetter
IdentifierChars JavaLetterOrDigit
JavaLetter:
any Unicode chatacter that is a Java letter(see below)
JavaLetterOrDigit:
any Unicode chatacter that is a Java letter-or-digit(see below)
-变量
-Int
. 0 2 0372 0xDada_Cafe 1996 0x00_FF_00_FF
-Long
.0I 0777L 0x100000000L 2_147_483_648L 0xC0B0L
-Float
. 1e1f 2.f .3f 0f 3.14f 6.022137e+23f
-Double
.1e1 2. .3 0.0 3.14 1e-9d 1e137
-操作
. += -= *= /= &= ;|= ^= %= <<= >>= >>>=
类型和变量
-元类型
.byte short int long float char
-变量初始化
.boolean false
.char \u0000
-类型
Java内存模型
类加载连接的过程
public static final abstract的定义
异常
数组的使用
-文法
JVM规范
-Class文件类型
-运行时数据
-帧栈
-虚拟机的启动
虚拟机的指令集
-泛型
-空白符
.空格tab\t换页\f行终结符
-注释
-标示符
-关键字
Java语言规范定义了什么是Java语言
Java语言和JVM相对独立
-Groovy
-Clojure
-Scala
JVM主要定义二进制class文件和JVM指令集等
Class文件格式
数字的内部表示和储存
-Byte -128 to 127(-2的7次方 to 2的7次方-1)
returnAddress数据类型定义
-指向操作码的指针。不对应Java数据类型,不能再运行时修改。finally实现需要:
定义PC
堆
栈
方法区
整数的表达
-原码:第一位为符号位(0为正数,1为负数)
-反码:符号位不动,原码取反
-负数补码:符号位不动,反码加1
-整数补码:和原码相同
-打印整数的二进制表示
int a=-6;
for(int i=0;i<32;i++){
int t=(a & 0x80000000>>>i)>>>(31-i);
System.out.print(t);
}
Float 的表示与定义
-支持IEEE 754
.s eeeeeee mmmmmmmmmmmmmmmmmmmmmmm
指数:8 尾数:23
.e全0 尾数附加为0 否则尾数附加位为1
.s*m*2^(e-127)
一些特殊的方法
-<clinit>
-<init>
深入JVM内核---原理,诊断与优化的更多相关文章
- 【深入JVM内核—原理、诊断与优化】第2期开课了
[深入JVM内核—原理.诊断与优化]的讲师“葛一鸣”,人称“一哥”,毕业于浙江工业大学,计算机软件与理论专业硕士,是国家认证系统分析师,OCP.2012年出版过<Java程序性能优化>,荣 ...
- JVM内核-原理、诊断与优化学习笔记(八):JAVA堆分析
文章目录 内存溢出(OOM)的原因 在JVM中,有哪些内存区间? 堆溢出 永久区 Java栈溢出 直接内存溢出 小问题? MAT使用基础 柱状图显示 支配树 显示线程信息 显示堆总体信息,比如消耗最大 ...
- JVM内核-原理、诊断与优化学习笔记(七):性能监控工具
文章目录 系统性能监控 系统性能监控- linux uptime top vmstat(虚拟内存统计) pidstat 系统性能监控 - windows 任务管理器 Perfmon Process E ...
- JVM内核-原理、诊断与优化学习笔记(四):GC算法与种类
文章目录 GC的概念 GC算法 引用计数法 引用计数法的问题 标记清除 标记压缩 小问题 复制算法 复制算法的最大问题是:空间浪费 整合标记清理思想 -XX:+PrintGCDetails的输出 gc ...
- JVM内核-原理、诊断与优化学习笔记(二):JVM运行机制
文章目录 JVM启动流程 PC寄存器 方法区 保存装载的类信息 通常和永久区(Perm)关联在一起 Java堆 Java栈 Java栈 – 局部变量表 ** 包含参数和局部变量 ** Java栈 – ...
- JVM内核-原理、诊断与优化学习笔记(六):类装载器
文章目录 class装载验证流程 class装载验证流程 class装载验证流程 -加载 class装载验证流程 -链接 验证 链接 -> 验证 文件格式的验证 元数据验证(class文件简单语 ...
- JVM内核-原理、诊断与优化学习笔记(三):常用JVM配置参数
文章目录 Trace跟踪参数 -verbose:gc (打开gc的跟踪情况) -XX:+printGC(打开gc的log开关,如果在运行的过程中出现了gc,就会打印出相关的信息.) -XX:+Prin ...
- JVM内核-原理、诊断与优化学习笔记(一):初识JVM
文章目录 JVM的概念 JVM是Java Virtual Machine的简称.意为Java虚拟机 虚拟机 有哪些虚拟机 VMWare或者Visual Box都是使用软件模拟物理CPU的指令集 JVM ...
- Java虚拟机深入JVM内核—原理、诊断与优化视频教程
http://www.eimhe.com/forum.php?mod=viewthread&tid=142832&highlight=%C4%DA%BA%CB
随机推荐
- WPF ListView VisualPanel
<ItemsPanelTemplate x:Key="ItemsPanelTemplate1"> &l ...
- Cocos2d-x v3.x and Xcode 6.x with ARM 64 Architecture
转自:http://becomingindiedev.blogspot.com.es/2014/12/cocos2d-x-v3x-and-xcode-6x-with-arm-64.html Hi! W ...
- HDU 1532 Drainage Ditches (网络流)
A - Drainage Ditches Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64 ...
- Incorrect string value: '\xF0\x9F...' for column 'XXX' at row 1
Incorrect string value: '\xF0\x9F...' for column 'XXX' at row 1 这个问题,原因是UTF-8编码有可能是两个.三个.四个字节.Emoji表 ...
- 实训随笔2:Git Gui——拯救菜鸟的工具
熟练使用git进行多人协作开发,是程序猿必备的专业技能之一,可惜我等实在太菜搞不来复杂的命令行. 幸好除了Git Bash还有一个Git gui存在——专门为了拯救我们这些菜鸡程序猿而存在的工具. 下 ...
- js 读本地文件
http://www.jb51.net/article/21191.htm <!doctype html> <html lang="en"> <hea ...
- UE4 中的 C++ 编程介绍
https://docs.unrealengine.com/latest/CHN/Programming/Introduction/index.html UE4 中的 C++ 编程介绍 Unreal ...
- jzoj6003. 【THUWC2019模拟2019.1.16】Square (乱搞)
题面 题解 不难发现,如果一行最后被染色,那么这行的颜色肯定一样,如果倒数第二个被染色,那么除了被最后一个染色的覆盖的那一部分剩下的颜色肯定一样 于是题目可以转化为每一次删去一行或一列颜色相同的,问最 ...
- [Xcode 实际操作]七、文件与数据-(11)数据持久化存储框架CoreData的使用:创建CoreData实体并插入数据
目录:[Swift]Xcode实际操作 本文将演示[CoreData]数据持久化存储框架的使用. 点击[Create a new Xcode project]创建一个新的项目 ->[Single ...
- node学习(2)-路由读取图片
通常我们开发项目的时候都要用到图片,那么nodejs是如何读取图片的呢? 我们来看一下,因为一个网页中图片的数量是不确定的,而我们不能每一张图片都去写它的src路径,这时候最好的方法就是写一个专门读取 ...