[置顶] 与小伙伴共勉的java有关jvm的知识(一),小鸟尽量写得详细哦,欢迎讨论,谢绝喷子
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的知识(一),小鸟尽量写得详细哦,欢迎讨论,谢绝喷子的更多相关文章
- Java虚拟机JVM相关知识整理
Java虚拟机JVM的作用: Java源文件(.java)通过编译器编译成.class文件,.class文件通过JVM中的解释器解释成特定机器上的机器代码,从而实现Java语言的跨平台. JVM的体系 ...
- [置顶]
Chat Room:基于JAVA Socket的聊天室设计
d0304 更新功能实现 d0312 更新部分图片&UI设计部分 d0318 更新功能实现 d1222 实现添加好友功能.实现注册功能.修改大量BUG github:https://githu ...
- Java、JVM和操作系统之间的关系,写给新人,
来张图:这个帖子写给新人的,老玩家就直接无视他,因为这个完完全全是白话基础原理. 解释:上面的图是从上往下依次调用的关系. 操作系统(Windows/Linux)管理硬件,让硬件能够正常.合理的运行, ...
- android linearlayout imageview置顶摆放
在练习android时,想在Linearlayout内放一图片,使其图片置顶,预期效果是这样的: 但xml代码imageview写成这样后, <ImageView android:layout_ ...
- [置顶] think in java interview-高级开发人员面试宝典(八)
面经出了7套,收到许多读者的Email,有许多人说了,这些基础知识是不是为了后面进一步的”通向架构师的道路“做准备的? 对的,你们没有猜错,就是这样的,我一直在酝酿后面的”通向架构师的道路“如何开章. ...
- [置顶] JAVA从零单排4-----继承、封装和多态详解
继承 Java三大特征之一:继承.Java的继承具有单继承的特点,每个子类只能有一个直接父类. 继承的特点 Java的继承用extends关键字来实现,被继承的类成为父类,实现继承的类被称为子类.子类 ...
- Android自定义ScrollView实现一键置顶功能
效果图如下: (ps:动态图有太大了,上传不了,就给大家口述一下要实现的功能吧) 要实现的功能:当ScrollView向上滑动超过一定距离后,就渐变的出现一个置顶的按钮,当滑动距离小于我们指定的距离时 ...
- Android的SwipeToDismiss第三方开源框架模拟QQ对话列表侧滑删除,置顶,将头像图片圆形化处理。
<Android SwipeToDismiss:左右滑动删除ListView条目Item> Android的SwipeToDismiss是github上一个第三方开源框架(github ...
- QQ好友列表向左滑动出现置顶、删除--第三方开源--SwipeMenuListView
SwipeMenuListView是在github上的第三方开源项目,该项目在github上的链接地址是:https://github.com/baoyongzhang/SwipeMenuListVi ...
随机推荐
- UVA 1572 Self-Assembly
拓扑排序,以边上标号为点,正方形为边,拓扑图中存在有向环时unbounded,否则bounded: 注意:仔细处理输入: 遍历一个点时,下一次遍历拼上的下一个方形边:即假设遍历到 A+ 时,下次从 ...
- 【测试环境】java|jdk|ant
很多文章都有写啊,我只是汇总一下:现在java已经是1.7+了,但是我们很多的时候开发环境还是在1.5.16左右,需要自己去配置: 0.为了方便切换测试环境,我们可以把jdk放到一个比较固定的位置.比 ...
- 构建混合云:配置Azure site to site VPN连接(3)
9. 那么我们来创建网关,创建网关的时候需要注意,看看你的设备是否支持动态网关,在本示例中的Cisco ASA 5550不支持动态网关,所以我们只能创建静态网关: 该创建会花费一定的时间,稍等即可. ...
- Python学习 常识+基础基础
特点: 优雅,明确,简单 领域: web网站 网络服务 系统工具和脚本 跨平台 对缩进要求严格 注释:# 动态语言:变量本身类型不固定 raw字符串与 多行字符串 raw字符串: 不需要转义字 ...
- Unix主机syslog配置
将下面的内容附加到/etc/syslog.conf文件中(注意*和@之间是有空格的): *.* @ip 修改/etc/services文件中的syslog服务的端口号为上面提到的Syslog监听端口. ...
- QT VS配置UNICODE问题
默认情况下,使用VSQT插件 导入.pro后,会自动在项目文件里面预定义好宏UNICODE,可以把该宏去掉,以免造成其他程序,使用多字节的代码出错 去除的两个方法 1.打开Propject->P ...
- Map map=new HashMap(); 为什么是这样
Map是接口,hashMap是Map的一种实现.接口不能被实例化. Map map=new HashMap(); 就是将map实例化成一个hashMap.这样做的好处是调用者不需要知道map具体的实现 ...
- C语言的本质(20)——预处理之二:条件预处理和包含头文件
我们可以通过定义不同的宏来决定编译程序对哪些代码进行处理.条件编译指令将决定那些代码被编译,而哪些是不被编译的.可以根据表达式的值或者某个特定的宏是否被定义来确定编译条件. 条件编译可分为三种情况,按 ...
- 【LeetCode练习题】Linked List Cycle II
Linked List Cycle Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it ...
- flex-linkbutton
LinkButton 控件是没有边框的 Button 控件,当用户将鼠标移动到该控件位置时,其内容将加亮显示.这些特征通常借助包含在浏览器页面中的 HTML 链接进行展示.为使 LinkButton ...