layout: post title: “2019-02-20-虚拟机” date: 2019-02-20 12:11:30 +0800

  1. android 源码

https://www.cnblogs.com/suxiaoqi/p/5109881.html

http://androidxref.com/9.0.0_r3/xref/frameworks/base/core/java/android/view/ViewRootImpl.java

  1. java虚拟机

IBM J9 Java

https://github.com/eclipse/openj9

  1. java虚拟机是操作系统的一个应用程序,作用 读取class文件并执行

1) 维护一个运行时 2) 将虚拟机指令/线程映射到操作系统 3) 建立底层C++的链接

基本内容:

加载类 存放变量 变量计算和存储

高级内容:

垃圾回收 线程管理 锁管理 网络请求

边边角角的内容 比如字体,电量,系统性能检测(原理)等

4) 内部结构

类加载系统

执行引擎

  • java指令集 248个指令

内存结构

  • 数据区
    • 所有线程共享
      • 方法区 类文件信息

        这个类型的完整有效名称(全名=包名.类名)

        这个类型直接父类的完整有效名称( java.lang.Object除外,其他类型若没有声明父类,默认父类是Object)

        这个类型的修饰符(public、abstract、final的某个子集)

        这个类型直接接口的一个有序列表

        类型的常量池( constant pool)

        域(Field)信息

        方法(Method)信息

        除了常量外的所有静态(static)变量

      • 堆 对象存储空间和数组

    • 单个线程独有
      • 程序计数器 保存线程的下一个指令
        • 由栈帧组成,栈帧内包含当前方法的局部变量,与执行方法一一对应. 随着函数进入而入栈,随着函数的结束而出栈 ( Java虚拟机不使用寄存器保存计算的中间结果,而是用Java堆栈在存放中间结果。这使得Java虚拟机的指令更紧凑,也更容易在一个没有寄存器的设备上实现Java虚拟机。 )
          • 局部变量表
          • 操作数栈
          • 动态连接
          • 方法返回地址
          • 附加信息
  1. 生命周期

一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序。程序开始执行时他才运行,程序结束时他就停止。你在同一台机器上运行三个程序,就会有三个运行中的Java虚拟机。 Java虚拟机总是开始于一个main()方法。在程序执行时,你必须给Java虚拟机指明这个包换main()方法的类名。 Main()方法是程序的起点,他被执行的线程初始化为程序的初始线程。程序中其他的线程都由他来启动。Java中的线程分为两种:守护线程 (daemon)和普通线程(non-daemon)。守护线程是Java虚拟机自己使用的线程,比如负责垃圾收集的线程就是一个守护线程。当然,你也可 以把自己的程序设置为守护线程。包含Main()方法的初始线程不是守护线程。 只要Java虚拟机中还有普通的线程在执行,Java虚拟机就不会停止。如果有足够的权限,你可以调用exit()方法终止程序。

  • 问题

HashMap是不是存在堆里面,如何查看HashMap的类信息.

异常是如何处理的

虚拟机和spring,虚拟机和android

java运行时和Kotlin运行时对比

参考文档: https://www.xuebuyuan.com/3194394.html https://blog.csdn.net/ningjiebing/article/details/79961035