-
虚拟机: 系统虚拟机、程序虚拟机
-
Java虚拟机
- 典型程序虚拟机 语言无关、平台无关 基于class字节码文件
- Java虚拟机 Sun HotSpot
- Java执行流程:
- .java源码编译成Class文件
- 类加载器加载到运行时数据区
- 执行引擎执行
- 垃圾回收器回收
-
运行时数据区包括:
- 程序计数器 虚拟机栈(由栈帧组成)
- 本地方法栈(jdk1.8与虚拟机栈合并)
- Java堆(新生代,老年代)
- 方法区(jdk1.8去掉了,融入到本地内存规划)
- 运行时常量池(原本在方法区,后移到了堆中)
-
垃圾回收
- Java垃圾回收由系统自动完成,C++垃圾回收自己完成
- 主要回收Java堆和方法区的对象
- 回收如何判断:根搜索算法
- 回收采用算法:标记-整理+分代收集
- 回收时间:系统自动化,标记一次进队列,标记两次回收。
-
垃圾收集器
- 新生代:Serial(单线程)、ParNew(多线程)、Parallel Scavenge(吞吐量)
- 老年代:Serial Old(单线程)、Parallel Old(多线程)、CMS(多线程,停顿时间)、
- 新生代和老年代:G1(最新技术,全区域)
-
JVM参数
- 标准参数
- X参数 最大最小堆内存设置
- XX参数 JVM调优和debug,打印gc信息,设置永久代大小
-
内存分配:
- 对象优先在新生代的Eden上分配
- 大对象和长期存活对象直接进行老年代
- 新生代转老年代阀值设置
-
虚拟机监控和分析工具:JDK自带工具
- JConsole、JVisualVM
-
类文件结构:Class字节码文件,魔数,版本号,常量池,访问标志,类索引,字段表集合,方法表集合,属性表集合
-
类加载过程
- 加载: 全限定名的二进制流,包括jar包、网络applet,运行时(动态代理)、文件如jsp生成,数据库读取。Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口
- 验证:文件格式验证、元数据验证、字节码验证、符号引用验证
- 准备:为类变量(static修饰)分配内存
- 解析:符号引用变为直接引用的过程
- 初始化:根据程序员的编码去初始化变量和资源,父类构造器,自身构造器,初始化过程是同步的,其他线程会阻塞
- 使用
- 卸载
- 总结:
①虚拟机启动时,初始化用户指定的类。
②当遇到用以新建目标类实例的 new 指令时,初始化 new 指定的目标类。
③当遇到调用静态方法的指令时,初始化该静态方法所在的类。
④当遇到访问静态字段的指令时,初始化该静态字段所在的类。
⑤子类的初始化会触发父类的初始化。
⑥如果一个接口定义了 default 方法,那么直接实现或间接实现该接口的类的初始化,会触发该接口的初始化。
⑦使用反射 API 对某个类进行反射调用时,会初始化这个类。
参考:https://www.cnblogs.com/ysocean/p/9345787.html