JVM: 后端编译(JIT编译器) 发表于 2017-01-01 | 分类于 JVM 解释器与JIT编译器当程序需要迅速启动和执行的时候,解释器可以首先发挥作用,省去编译的时间,立即执行。在程序执行后,随着时间的推移,JIT编译器逐渐发挥作用,把越来越多的代码编译成本地机器码,可以获得更高的执行效率。 可以使用解释器执行节约内存,反之使用JIT编译器来提升效率。 HotSpot虚 ... 阅读全文 »
前端编译(Javac编译器) 发表于 2017-01-01 | 分类于 Java SE Java语言中的“编译期”是一段“不确定”的操作过程。可能指的是以下三种: 前端编译器 把.java文件转变成.class文件的过程。 例如:Sun的javac、Eclipse JDT中的增量式编译器(ECJ) 后端编译器 把字节码转变成机器码的过程。 例如:JIT编译器(分为c ... 阅读全文 »
C和Java编译执行的过程比较 发表于 2017-01-01 | 分类于 Java SE 编译不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现。分为解释执行和编译执行。 上图中间的那条分支是解释执行的过程(即一条字节码一条字节码地解释执行,如 JavaScript ... 阅读全文 »
Java 几种引用 发表于 2016-12-31 | 分类于 Java SE Java中存在四种引用:强引用、软引用、弱引用、虚引用。 强引用强引用(Strong Reference):是最普通的引用类型,只要强引用存在,GC就不会进行垃圾回收。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解 ... 阅读全文 »
Java 反射原理解析 发表于 2016-12-31 | 分类于 Java SE Java的反射机制允许我们动态的调用某个对象的方法/构造函数、获取某个对象的属性等,而无需在编码时确定调用的对象。 Method JDK中Method.invoke()实际上并不是自己实现的反射调用逻辑,而是委托给sun.reflect.MethodAccessor来处理的。 首先要了解Met ... 阅读全文 »
Java 动态代理与反射 发表于 2016-12-31 | 分类于 Java SE 代理代理模式的特征是代理类与委托类有相同的接口。 为某个对象提供一个代理,通过代理类这一中间层,可以有效地隐藏和保护被代理的真实对象,以控制对这个对象的访问。 代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类以及事后处理等。 根据代理类的创建时间不同可以分为静态代理和动态代理。静态 ... 阅读全文 »
Java 反射 发表于 2016-12-31 | 分类于 Java SE 简介反射能够让运行在JVM中的程序检测和修改运行时的行为,使用反射API可以在运行时获取对象的内部结构信息。 JVM的类加载机制允许从多种源动态地加载Java类,但是动态类加载有一个重要的缺点,即我们在使用动态加载的类对象时,往往对这个类知之甚少,甚至于一无所知。这种情况下就需要使用一种动态编程技 ... 阅读全文 »
Java 泛型Generics 发表于 2016-12-30 | 分类于 Java SE 简介Java泛型(Generics)是JDK 1.5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter)。声明的类型参数在使用时用具体的类型来替换,泛型最主要的应用是在JDK 1.5中的新集合类框架中。 泛型使得编译器在编译时就可以发现很多错误,可以解决之前的集合 ... 阅读全文 »
Java 初始化顺序 发表于 2016-12-30 | 分类于 Java SE 初始化操作的执行顺序: 所有静态成员/初始块先执行 父类初始化完成(非静态成员/初始块执行 -> 构造函数调用) 子类初始化完成(非静态成员/初始块执行 -> 构造函数调用) 例子:123456789101112131415161718192021222324252627282930 ... 阅读全文 »
Java集合框架(15): HashMap和HashTable异同 发表于 2016-12-30 | 分类于 Java集合框架 相同点 HashMap和HashTable都是存储“键值对”的散列表,都采用拉链法解决Hash冲突。 添加key-value键值对:首先,根据key值计算出哈希值,再计算出数组索引(即,该key-value在table中的索引)。然后,根据数组索引找到Entry(即,单向链表),再遍历单向链表,将 ... 阅读全文 »