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. 【stm32】实现STM32的串口数据发送和printf函数重定向

    在调试电机驱动程序的时候,是不能随便利用中断来进行一些寄存器或数据的查看的,不然你在运行的时候突然来一下,如果占空比大的话那可能直接就把MOS管给烧了,所以我们很多情况下只能使用USART(串口)来进 ...

  2. HeadFirst设计模式读书笔记--目录

    HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern) HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern) HeadFirst设计 ...

  3. cf455A Boredom

    A. Boredom time limit per test 1 second memory limit per test 256 megabytes input standard input out ...

  4. Bayesian Formulation on Cooperative Tracking

    Suppose a joint state representing a set of \(N_{n}\) nodes moving in a field\[    \textbf{X}=    \b ...

  5. tomcat root dir log 配置

    tomcat 配置log记录及root 目录

  6. Ubuntu12.04 Jdk1.7 Tomct7.0部署配置

    jdk1.7 下载 http://download.oracle.com/otn-pub/java/jdk/7u67-b01/jdk-7u67-linux-x64.tar.gz?AuthParam=1 ...

  7. flex 载入GIF图片

    李石磊 学习日记 一.下载GIFPlayer包 二.源代码例如以下: <?xml version="1.0" encoding="utf-8"?> ...

  8. Android_通过ContentObserver监听短信数据变化

    1.简单介绍 在小米等一些机型,无法接收系统发出的短信广播. 仅仅能通过观察者ContentObserver,去监听短信数据的变化 2.SMS数据介绍 content://sms/inbox     ...

  9. C++ 顶层 const

    我的主力博客:半亩方塘 本文的主要參考来源来自于:C++ Primer 中文版(第 5 版) 第 57 面至第 58 面 1. 顶层 const 与底层 const 概念 我们知道,指针本身是一个对象 ...

  10. CSDN博文大赛火爆开启

    俗话说的好,程序猿会写博,谁也挡不住! 是不是每一个开发人员都能写出好博文,这个非常难说,但能够肯定的是,能写出好博文的,一定是优秀的程序猿! 写作即思考,养成写博文的习惯,既能帮自己整理技术思路,也 ...