Java虚拟机的一些笔记(十一)

  • 虚拟机: 系统虚拟机、程序虚拟机

  • Java虚拟机

  1. 典型程序虚拟机 语言无关、平台无关 基于class字节码文件
  2. Java虚拟机 Sun HotSpot
  • Java执行流程:
  1. .java源码编译成Class文件
  2. 类加载器加载到运行时数据区
  3. 执行引擎执行
  4. 垃圾回收器回收
  • 运行时数据区包括:

    • 程序计数器 虚拟机栈(由栈帧组成)
    • 本地方法栈(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字节码文件,魔数,版本号,常量池,访问标志,类索引,字段表集合,方法表集合,属性表集合

  • 类加载过程

  1. 加载: 全限定名的二进制流,包括jar包、网络applet,运行时(动态代理)、文件如jsp生成,数据库读取。Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口
  2. 验证:文件格式验证、元数据验证、字节码验证、符号引用验证
  3. 准备:为类变量(static修饰)分配内存
  4. 解析:符号引用变为直接引用的过程
  5. 初始化:根据程序员的编码去初始化变量和资源,父类构造器,自身构造器,初始化过程是同步的,其他线程会阻塞
  6. 使用
  7. 卸载
  8. 总结:
    ①虚拟机启动时,初始化用户指定的类。
    ②当遇到用以新建目标类实例的 new 指令时,初始化 new 指定的目标类。
    ③当遇到调用静态方法的指令时,初始化该静态方法所在的类。
    ④当遇到访问静态字段的指令时,初始化该静态字段所在的类。
    ⑤子类的初始化会触发父类的初始化。
    ⑥如果一个接口定义了 default 方法,那么直接实现或间接实现该接口的类的初始化,会触发该接口的初始化。
    ⑦使用反射 API 对某个类进行反射调用时,会初始化这个类。

参考:https://www.cnblogs.com/ysocean/p/9345787.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值