JVM(二)
来源:互联网 发布:3160ac无线网卡优化 编辑:程序博客网 时间:2024/05/17 23:30
JAVA虚拟机执行
JVM的执行都是通过字节码指令来执行。如两个int类型数据相加通过iadd指令,所以JAVA文件经过编译后,可能形成的是各种指令。
同步的实现
JAVA的同步使用两个指令来实现monitorenter,monitorexit,同步块是使用这两个指令显示的达到锁的效果,当monitorenter进入后,线程就是持这个块的锁,阻塞了其它的访问,直到monitorexit指令被调用 ,同步方法是隐式的实现,通过常量池表中ACC_SYNCHORIZED常量标注方法,最后还是这两个指令实现。
虚拟机启动的过程
JAVA虚拟机在启动的过程通过引导类(bootstrap class load)创建一个初始类来完成,创建这个类实现是虚拟机内部实现,这个类有一个main方法,启动过也是在这个main方法中完成,在main方法中会进行依次加载类,然后对加载的类进行链接,后面进行初始化。
1、加载
根据特定名称找到CLASS的二进制表示,并根据这个二进制创建类或接口的过程。
加载类的过程,可以使用引导类直接加载也可以委托其它加载类来实现加载 ,也可以使用自定义的加载类,所有的加载类都是ClassLoader的实现。加载类过程一般都是一个委托的过程,A委托B,B委托C加载类M。
加载一般分为两种,一种是引导类加载 ,一种自定义实现的加载类(实现ClassLoader,包含loadClass(N) 方法),被加载的类,在加载前应该是存在方法区中。在加载的时候会进行一些安全的校验。
数组的创建是由虚拟机来实现的,如果是一些引用类型的数组内的对象则先是进行加载类载入,然后再由虚拟机来创建数组,数组不由加载类来创建。
2、链接
链接是对已经成功加载的类进行验证、准备、解析
验证:链接对已经加载类进行一次验证,验证主要确保类的二进制在结构信息上正确
准备:创建类或接口的静态字段,并用默认值初始化这些字段 ,但不执行任何虚拟机字节码指令
解析:对类的二进制码中运行常量池符号引用进行解析成直接引用
初始化
初始化调用类或接口的 init方法进行初始
类是调用cinit方法进行初始化,这个方法是特殊方法,不符合JAVA规范,不能在编译通过的。只有通过new指令或调用静态方法或属性时才会触发类的初始化。
初始化需要考虑多线程并发对类的初始,所以使用了初始锁,每个类或接口都有一个初始锁LC。通过LC防止多线程同时执行初始化。
- JVM学习(二)
- jvm调优(二)
- jvm(二)
- jvm基础(二)
- JVM内部结构(二)
- JVM 初探(二)
- JVM(二)
- JVM(二)— JVM内存模型
- JVM(二)JVM内存布局
- jvm优化(二)JVM 内存大小设置
- jvm调优(二)概念
- jvm学习笔记(二)
- jvm知识总结(二)
- jvm面试题(二)
- java-jvm调优(二)
- jvm工具(二)jstat
- JVM规范二(数据类型)
- JVM内存区域(二)
- Oracle函数总结:字符函数
- Java的web
- 【02】框架学习—Hibernate第一个入门案例详解
- HDOJ 2092 整数解
- GitHub的简单使用
- JVM(二)
- EL与JSTL
- 数据结构实验之链表五:单链表的拆分
- C# Newtonsoft.Json解析数组的小例子看懂一个全都会
- unity_NGUI系统学习(八)_Tween动画
- HDOJ2021_发工资
- ssm的关联映射
- Spark2.x学习笔记:12、Shuffle机制
- CF Round #439 (Div 2)