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. 看懂这个sql 你的sql语句就掌握了

    某财务报表 USE [PB_AHTC]GO/****** Object: StoredProcedure [dbo].[JSPRO] Script Date: 12/10/2013 11:54:52 ...

  2. JIT和程序的首次执行

    由于C#源代码经过编译器编译生成的是IL代码,而IL是与CPU无关的机器语言.因此当程序运行于特定的CPU时,首先必须将IL转换成本地CPU指令,这正是JIT(Just-In-Time)编译器的任务. ...

  3. 服务端无法获取到Ajax发送post请求的参数

    js类似于这样: function send() { var xhr = new XMLHttpRequest(); xhr.open("post", "AjaxTest ...

  4. qq视频api代码

    <!--视频容器--> <div id="mod_player"></div>   <!--腾讯视频代码开始--> <scri ...

  5. 关于CoreData的理解和使用.

    CoreData是苹果官方推出的一种方便的面向对象的存储方式,相信大家都已经对其有所了解,但是对于CoreData的概念大家都存在部分的误区.给大家推荐个网址是苹果的官方文档的翻译版(http://o ...

  6. hdu 5623 KK's Number(dp)

    问题描述 我们可爱的KK有一个有趣的数学游戏:这个游戏需要两个人,有N\left(1\leq N\leq 5*{10}^{4} \right)N(1≤N≤5∗10​4​​)个数,每次KK都会先拿数.每 ...

  7. C#整理1——进制转换

    进制转换:二进制,八进制,十进制,十六进制. (一)二进制转十进制: 1.写2 2.标指数,从右向左,从0开始依次标记 3.乘系数,一一对应. 4.相加. 例:二进制数1101转十进制数* 1.2   ...

  8. z-index解决弹出层遮罩层覆盖子div不能显示输出的问题

    // 添加以下代码来进行测试: // ajax 发生错误,就会执行$('body').ajaxError(function(e, xhr, setting, text){    // e - even ...

  9. 移动端影像解决方案Adobe Creative SDK for ios

    移动端影像解决方案Adobe Creative SDK for ios 2015-12-20 分类:整理 阅读(390) 评论(0)  老牌影像界泰斗不甘落寞,正式推出了Adobe Creative ...

  10. 前端公共库cdn服务推荐//提高加载速度/节省流量

    前端公共库cdn服务推荐,使用可以提高js库加载速度同时也可以节省自己空间的流量,CDN加速公共库虽好,不过一定要使用靠谱的前端cdn服务提供方. 以下整理出比较靠谱的国内cdn加速服务器.排名不分先 ...