每每谈到Java Virtual Machine, 你必须意识到这个有三种意思:

1 一个抽象的指南

2 一个具体的实现

3 一个运行时的实例

JVM 的生命周期

每个运行时JVM 实例都是为一个特定的应用程序服务的,随着应用程序的消亡而消亡。

起始点是main 方法,这个大家都知道。

public static void main(final String[] args) {
        ApplicationContext context = ApplicationContextUtils.getApplicationContext();
        WeatherBusiness weatherBusiness = context.getBean(WeatherBusiness.class);
        weatherBusiness.getWeather();
    }

随便一个public static void main 方法就是个入口了。

至于要如何启动这个方法,就得看不同的JVM 初始化实现方式。

在一个经典的Sun Java 2 SDK 中,可以用命令行的方式启动:

java ClassName Parametes

在JVM 的世界里,线程有守护线程和非守护线程两种。一般如GC 线程之类的守护线程都是JVM 自己用的。

Main 方法线程是初始线程,不能是守护线程。

也因此,当所有的非守护线程都返回后,JVM 实例将会退出。

JVM 的架构

关于类型加载器,执行引擎以及Native 方法接口,这个在以前的部分已经有阐述。

这里关注的是类型加载器载入在内存中的东东。

部分JVM 中的运行时数据是被应用程序的所有线程所共享的。

每个JVM 都对一个自己的method area 和 heap, JVM 每装载一个class 文件,就将类型信息等二进制信息放入这个method area. 顺便把应用程序实例化的对象扔到heap 里面。

数据类型

Java 语言中的基本类型基本对应了JVM 中的基本类型。JVM 对于boolean 是用int 来实现的。

有一种特殊的类型就是returnAddress 类型,这种类型是用在 finally 里面。

方法区

JVM 中,所有类型相关的信息被存在一个块叫做method area 的逻辑内存中。

一些类中的静态的字段同样也是存在method area中。

所有线程都共享同一块method area.

method area 大小是不固定,同时也是可以被GC 的。

类型信息

1 类型全限定的名称

2 类型直接父类的全限定名称

3 类型是class 还是接口

4 类型的访问级别

。。。。。。

除了这些类型信息意外,JVM 还必须保存以下这些东西:

1 该类型的常量池

2 字段信息

3 方法信息

4 static 变量

5 一个到ClassLoader 的引用

6 一个到Class 的引用

常量池

常量池类型于一个数组。

字段信息

字段名

字段类型

字段访问级别

方法信息

方法名

方法返回类型

方法参数

方法访问级别

当然还有:

方法的字节码,方法栈大小,异常表

类变量

static 而不是常量的类变量的处理方式是不同的。

这个后面有讲述

一个ClassLoader 的指针

这个东东表面是哪个类型加载器加载了这个类型,必须的。

一个Class 类的指针

每加载一个类型,一个java.lang.Class 类的实例就被创建了。

这个class 实例,可以让你能够访问method table 中的元数据。

Note:

一个Java 应用程序对应一个JVM 实例?

Main 方法所在的初始线程可以是守护线程么?

一个JVM 实例有一个自己的method area 和 heap?

JVM 有一种特殊的returnAddress 类型?

类的静态变量存在哪里?

method area 必须是线程安全的?

每加载一种类型,就会创建一个java.lang.Class 的实例。

最新文章

  1. Linq之旅:Linq入门详解(Linq to Objects)
  2. prototype,__proto__,constructor
  3. HDU1518 Square(DFS)
  4. Struts2笔记——result结果类型
  5. 【转】Select模型原理
  6. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(44)-工作流设计-设计表单
  7. Android扫描SD卡中的文件
  8. _int64、long long 的区别
  9. JDBC连接sql server数据库操作
  10. 关于ajax请求数据,并将数据赋值给全局变量的一些解决方法
  11. jwt、session、oauth 异同
  12. vue 轮播图插件 vue-awesome-swiper
  13. react之异步请求数据,render先行渲染报错,未拿到数据
  14. 统计py文件中的代码行
  15. Java 把异常传递给控制台
  16. 将docker的image转移到数据盘
  17. MYSQL 表转 JavaBean 工具类
  18. 数学图形(1.45)毛雷尔玫瑰(Maurer rose)
  19. PopupMenu弹出菜单
  20. 串口通信,帧与帧之间的时间间隔问题?9600波特率,帧将各在20ms以上

热门文章

  1. how to combine jpg + separate alpha in png?
  2. Egret命令行小结
  3. 关于FlexPaper 2.1.2版本 二次开发 Logo 、打印、搜索、缩略图、添加按钮、js交互、右键菜单、书签等相关问题
  4. msmms (二) sms与mms 简述!
  5. 转 Citrix XenCenter安装VM之挂载ISO详解
  6. UVa12726 one Friend at a Time (位 广搜)
  7. 15个超实用的php正则表达式
  8. jQuery.snowflake雪花飘落插件
  9. 前端框架react研究
  10. 简单聊下IO复用