JAVA运行在JVM之上,JVM的运行状况会对程序产生很大的影响,因此了解一些JVM的东东,对于编写稳定的,高性能的java程序至关重要。这是JVM的规范中定义的标准结构图:

以上标准是JVM标准中定义的,各个厂商在实现的时候不一定完全遵守.
JVM负责装载class文件并执行,因此首先要掌握的是JDK如何将java代码编译成class文件,如何装载class文件及如何执行class,将源码编译成class文件的实现取决于各个JVM的实现或各种源码编译器,class文件通常由ClassLoader来加载完成,class的执行在SUN的JDK中有解释执行和编译为机器码执行两种,其中编译为机器码又分为client和server两种模式。SUN的jdk为了提升class的执行效率,对于编译执行和解释执行都设置了很多的优化策略。

在此我们主要讨论SUN的jdk1.6,蝌蚪主要从三方面来介绍一下,(类的编译加载,jvm内存回收,jvm的多线程支持)如果时间允许会更多的,请持续关注,谢谢小伙伴,你们的支持是我持续更新的最大动力。

jvm规范中规定了class文件的格式,但是没有定义java源码如何编译为class文件,各个厂商在实现JDK的时候通常会将符合符合java语言规范的源码编译为class,SUN的jdk中编译命令就是javac,javac编译的过程如下图:

在此重点说一下第三步,Analyse步骤基于抽象语法树进行一系列的语义分析,包括将语法树中名字,表达式,等元素与变量、方法、类型等联系到一起;如检查变量使用前是否已声明,推导泛型方法的类型参数;检查类型匹配性;进行常量折叠;检查所有语句都可到达;检查所有的checked exception都被捕获或抛出,检查变量的确定性赋值(如有返回值的方法必须确定有返回值),检查变量的确定性不重复赋值(例如声明为final的变量等);解除语法糖(消除一些无用的代码);将java泛型转化为普通java,还有就是讲复杂的语法树变为简单的,如foreach,自动拆箱,装箱等一系列的动作,现在知道编译期做了多少事了吧。

类加载的整个过程如下:

1.装载;
装载就是负责找到二进制字节码并加载到JVM中,JVM通过类的全限定名及类加载器来完成类的加载,因此说,标识唯一一个被加载的类就是通过以上两个东东来的。类名的命名方式是这样的:
对于接口或者非数组类型的类,其名称就是类名,此种类型的类由所在的ClassLoader负责加载;
对于数组类型的类来说,其名称为“[”+基本类型 或者 L+引用类型名称,例如:
byte[] byte = new byte[512]; 类名:[ B;
Object objects = new Object[10] 类名:[Ljava.lang.Object
数组型类中的元素由所在的ClassLoader负责加载,但数组类型由JVM直接创建。

2.链接
链接过程负责对二进制字节码的格式进行校验、初始化装载类中的静态变量及解析类中调用的接口,类。
3.初始化
初始化过程即执行类中的静态初始化代码,构造器代码及静态属性的初始化,一下四种情况初始化过程会被触发:
a,调用了new;
b,反射调用了类中的方法;
c,子类调用了初始化;
d,JVM启动过程中指定的初始化类
在执行初始化之前,必须先完成链接过程的校验和准备阶段,解析阶段则不强求。

JVM的类加载通过ClassLoader及其子类来完成,分为Bootstrap ClassLoader,Extention ClassLoader, System ClassLoader,User-Define ClassLoader,其关系如图所示:

[置顶] 与小伙伴共勉的java有关jvm的知识(一),小鸟尽量写得详细哦,欢迎讨论,谢绝喷子的更多相关文章

  1. Java虚拟机JVM相关知识整理

    Java虚拟机JVM的作用: Java源文件(.java)通过编译器编译成.class文件,.class文件通过JVM中的解释器解释成特定机器上的机器代码,从而实现Java语言的跨平台. JVM的体系 ...

  2. [置顶] Chat Room:基于JAVA Socket的聊天室设计

    d0304 更新功能实现 d0312 更新部分图片&UI设计部分 d0318 更新功能实现 d1222 实现添加好友功能.实现注册功能.修改大量BUG github:https://githu ...

  3. Java、JVM和操作系统之间的关系,写给新人,

    来张图:这个帖子写给新人的,老玩家就直接无视他,因为这个完完全全是白话基础原理. 解释:上面的图是从上往下依次调用的关系. 操作系统(Windows/Linux)管理硬件,让硬件能够正常.合理的运行, ...

  4. android linearlayout imageview置顶摆放

    在练习android时,想在Linearlayout内放一图片,使其图片置顶,预期效果是这样的: 但xml代码imageview写成这样后, <ImageView android:layout_ ...

  5. [置顶] think in java interview-高级开发人员面试宝典(八)

    面经出了7套,收到许多读者的Email,有许多人说了,这些基础知识是不是为了后面进一步的”通向架构师的道路“做准备的? 对的,你们没有猜错,就是这样的,我一直在酝酿后面的”通向架构师的道路“如何开章. ...

  6. [置顶] JAVA从零单排4-----继承、封装和多态详解

    继承 Java三大特征之一:继承.Java的继承具有单继承的特点,每个子类只能有一个直接父类. 继承的特点 Java的继承用extends关键字来实现,被继承的类成为父类,实现继承的类被称为子类.子类 ...

  7. Android自定义ScrollView实现一键置顶功能

    效果图如下: (ps:动态图有太大了,上传不了,就给大家口述一下要实现的功能吧) 要实现的功能:当ScrollView向上滑动超过一定距离后,就渐变的出现一个置顶的按钮,当滑动距离小于我们指定的距离时 ...

  8. Android的SwipeToDismiss第三方开源框架模拟QQ对话列表侧滑删除,置顶,将头像图片圆形化处理。

      <Android SwipeToDismiss:左右滑动删除ListView条目Item> Android的SwipeToDismiss是github上一个第三方开源框架(github ...

  9. QQ好友列表向左滑动出现置顶、删除--第三方开源--SwipeMenuListView

    SwipeMenuListView是在github上的第三方开源项目,该项目在github上的链接地址是:https://github.com/baoyongzhang/SwipeMenuListVi ...

随机推荐

  1. Ring3 和Ring0 解释

    这得从CPU指令系统(用于控制CPU完成各种功能的命令)的特权级别说起.在CPU的所有指令中,有一些指令是非常危险的,如果错用,将导致整个系统崩溃.比如:清内存.设置时钟等.如果所有的程序都能使用这些 ...

  2. [Django 1.5] jQuery/Ajax 在Django使用 ,如何更新模板里里变量

    最近希望实现一个页面局部刷新的功能,于是开始查阅ajax资料.幸好现在ajax很多功能都封装在jQuery这个库里面,我们可以很方便去调用.通过学习几个简单的小例子,可以实现简单的前端代码更新,还有重 ...

  3. uva 10382 Watering Grass_贪心

    题意:给你个矩形n*m,再给你n个圆的圆心坐标和半径,问最用最少用几个圆把这个矩形覆盖 思路:直接想发现这问题不容易,后来发现可以把圆看做区间(能把矩形面积覆盖),然后这个问题就容易解决了 #incl ...

  4. Jenkins的安全控制

    在默认配置下,Jenkins是没有安全检查的.任何人都可以以匿名用户身份进入Jenkins,设置Jenkins和Job,执行build操作.但是,Jenkins在大多数应用中,尤其是暴露在互联网的应用 ...

  5. 关于select

    select 1与select * 的区别:“selelct 常量 from 表名” 对应所有行,返回的永远只有一个值,即常量 ,所以一般只用来判断是否有表记录:而“select * from 表名” ...

  6. eclipse sysout快捷输入启用

    Window-Preference-java-editor-content assist-advanced 一定要勾选Template Propasals. 关于Template Propasals: ...

  7. PHP自学4——通过函数将数组数据输出到html的Table标签中(使用函数的例子)

    这一节其实说实话并没有什么干货,不过为了防止PO主的懒癌的复发,还是坚持放一点东西,即使是内容和长度都令人发指.这一节通过一个函数来实现将数组中的内容输出html的Table标签当中显示. 函数文件— ...

  8. UVA 1614 - Hell on the Markets

    题意: 输入n个数,第i个数ai满足1≤ai≤i.对每个数添加符号,使和值为0. 分析: 排序后从最大的元素(假设为k)开始,凑出sum/2即可.用去掉了k的集合,一定可以凑出sum/2 - a[k] ...

  9. OC——封装(初级与高级)

    所谓的封装,就是通过定义方法或者函数去操作成员属性或者成员变量,而不是直接通过指针方式去操作.借此达到提高代码安全性,代码可行性以及代码执行效率的目的. 1:初级封装,对成员变量进行封装. #impo ...

  10. VS 调试Window Server方法

    在需要调试的地方加 Debugger.Launch();然后在本机安装服务并启动即可进入