JVM是Java Virtual Machine的简称,意为Java虚拟机。
虚拟机:指通过软件模拟的具有完全硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统
虚拟机种类:VMWare、Visual Box、JVM
VMWare或者Visual Box都是使用软件模拟物理CPU的指令集,JVM使用软件模拟java字节码的指令集
1996年 SUN JDK1.0 Classic VM
-纯解释运行,使用外挂进行JIT
1997年JDK1.1发布
-AWT、内部类、JDBC、RMI、反射
1998年 JDK1.2 Solaris Exact VM
-JIT解释器混合
-Accurate Memory Management 精准内存管理,数据类型敏感
-提升GC性能
2000年 JDK1.3 Hotspot作为默认虚拟机发布 加入JavaSound
2002年 JDK1.4 Classic VM退出历史舞台 Assert正则表达式 NIO IPV6日志API 加密类库
2004年发布 JDK1.5 即JDK5、J2SE 5、Java 5
-泛型
-注解
-装箱
-枚举
-NIO 2.0
2014年 JDK8发布
-Lambda表达式
-语法增强 Java类型注解
2016年JDK9
-模块化
----------------------------
Java语言规范
-语法
-变量
-类型
-文法
—————————
JVM规范
-Class文件类型
-运行时数据
-帧栈
-虚拟机的启动
-虚拟机的指令集
——————————————————————————————————————————————————
JVM启动流程:
装载配置(根据当前路径和系统版本寻找jvm.cfg)-根据配置寻找JVM.dll(JVM.dll为JVM主要实现)-初始化JVM获得JNIEnv接口(JNIEnv为JVM接口,findClass等操作通过它实现)-找到main方法并运行
—————————————————————————————————————————————————-—
内存空间:方法区、java堆、java栈、本地方法栈
_______________________________________
PC寄存器
方法区:保存装载的类信息:类型的常量池、字段,方法信息、方法字节码
GC分代,堆也是分代的
java栈:线程私有、栈有一系列帧组成、
帧保存一个方法的局部变量、操作数栈、常量池指针、每一次方法调用创建一个帧,并压栈、java没有寄存器,所有参数传递使用操作数栈、小对象在没有逃逸的情况下,可以直接分配在栈上,大对象或者逃逸对象无法栈上分配
———————————————————————————————————————————————————
解释运行:
-解释执行以解释方式运行字节码
-解释执行的意思是:读一句执行一句
编译运行(JIT):
-将字节码编译成机器码
-直接执行机器码
-运行时编译
-编译后性能有数量级的提升
———————————————————————————————————————————————————
常用JVM配置参数
-verbose:gc
-XX:+printGC
打开gc监控开关,打印GC简单信息
-XX:+printGCDetails
-打印GC详细信息
-Xloggc:log/gc.log
-指定GC log的位置,以文件输出
-帮助开发人员分析问题
-Xmx
-指定最大堆