Java的理解
java是一门纯粹的面向对象的语言。
面向对象这种程序设计模式它将现实世界中的一切事物都看作是对象,例如,一个人是一个对象,汽车、飞机、小鸟等等,都是对象;它强调从对象出发,以对象为中心用人类的思维方式来认识和思考问题。每个对象都具有各自的状态特征(也可以称为属性)及行为特征(方法),java就是通过对象之间行为的交互来解决问题的。
1.平台无关性
(1)为什么要先编译成java字节码再解析成机器码
a.准备工作:每次执行都需要各种检查。
因为编译的过程本来就是在进行编译以及检查的过程,如果直接对java代码解析成机器码,岂不是每次解析的时候都需要进行检查,何不提前检查好了,再进行解析
b.兼容性:也可以将别的语言解析成字节码
比如Clojure,Groovy, JRuby, Jython , Scala等他们最终会 通过不同的编译器(java是javac编译器)编译成 .class字节码在虚拟机进行运行
(2)JVM如何加载.class文件
java虚拟机:
a.JVM内存结构模型
JVM是内存中的虚拟机,可以理解为,JVM的存储就是内存,我们所有写的常量,变量,方法都在内存中
JVM架构:
ClassLoader (类加载器) : 依据特定的格式,加载class文件到内存
Runtime Data Area (运行数据区域) :JVM内存空间结构模型
Execution Engine (执行引擎) :对命令进行解析(解释器,对命令进行解析,能不能运行需要他来负责)
Native Interface (本机接口) :融合不同开发语言的原生库为java所用,使用Class.forName()方法中的forName0()方法进行其他语言的类库的调用,返回值是native
类从编译到执行的过程(java从源码到运行共有三个阶段)
编译器将*.java源文件编译为*.class字节码文件 Source源码阶段
ClassLoader将字节码转换为JVM中的Class<对象名>对象(实质是byte数组) Class类对象阶段
JVM利用Class<对象名>对象实例化 * 对象加载到内存 Runtime运行时阶段
ClassLoader
作用:
ClassLoader负责通过将Class文件的二进制数据流(使用io流进行读取的)装载进系统,然后交给java虚拟机进行连接,初始化操作(从系统外获取Class的二进制数据流)
种类: (Alibaba Dragonwell 是一款免费的 OpenJDK 发行版)
BootStrapClassLoader :C++编写,加载核心库java.* http://hg.openjdk.java.net/jdk8u/jdk8u/jdk==>browse==>src==>share==>native==>java.lang
ExtClassLoader :java编写,加载扩展库javax.* System.out.println(System.getProperty(“java.ext.dirs”));
AppClassLoader :java编写,加载程序所在目录 System.out.println(System.getProperty(“java.class.path”));
自定义ClassLoader
双亲委派机制:
1.自下向上检查类是否已经加载 自定义ClassLoader==》AppClassLoader==》ExtClassLoader ==》BootStrapClassLoader
2.自上向下尝试加载类 BootStrapClassLoader (jre/lib/rt.jar)==》ExtClassLoader(jre/lib/ext/*.jar) 》AppClassLoader(classpath目录)》自定义ClassLoader
小编总结:双亲委派机制:检查类是否加载的时候,顺序是自下而上的。如果是加载类的时候,顺序是自上而下的
有资料或文档需求的可以关注公众号发送暗号“12”即可哦
为什么要使用双亲委派机制:
1.避免多份同样字节码的加载(使用委托机制逐层去父类查找是否加载)
类的加载方式:(了解)
隐式加载:new (隐式调用类加载器将类加载带JVM)
显式加载:loadClass,forName等
loadClass和forName的区别:(了解)
Classloder.loadClass得到的class是没有链接的 JDBCUtils.class.getClassLoader() //getResourceAsStream(“druid.properties”)
Class.forName得到的class是已经初始化完成的 Class.forName(“cn.itcast.utils.JDBCUtils”)
JVM内存模型-JDK8:
1.程序计数器: