Java 语言的 “编译期”其实可以分为3类编译过程: 前端编译器:把*.java文件转变成*.class文件的过程。 后端运行期编译器(JIT编译器):把字节码转变成机器码的过程。 静态提前编译器(AOT编译器):直接把*.java文件编译成本地机器代码的过程。 Javac这类编译器对代码的运行效 ...
分类:
其他好文 时间:
2018-07-29 15:13:25
阅读次数:
161
因此,java中的字符串引用存放在栈中,如果在编译期已经定义好,则存放在常量池中,如果在运行期间出来的对象则存储在堆中,对于通过equals方法比较相等的字符串在字符常量池中只有一个,在堆中可能有多个。 this.value=Arrays.copyOf(values, values.length); ...
分类:
编程语言 时间:
2018-07-26 15:03:50
阅读次数:
242
1.前言 本文记录内容来自《深入理解Java虚拟机》的第十章早期(编译期)优化其中一节内容,其他的内容个人觉得暂时不需要过多关注,比如语法、词法分析,语义分析和字节码生成的过程等。主要关注的就是Java的一些语法糖是如何实现的。 语法糖不会提供实质性的功能改进,但是它们或能提高效率,或能提升语法的严 ...
分类:
编程语言 时间:
2018-07-21 22:50:16
阅读次数:
215
java内存区域 程序计数器 因为java可以多线程并发执行,因此,为了线程切换后能恢复到正确的执行位置,每个线程都需要一个独立的程序计数器。记录正在执行的虚拟机字节码指令的地址。 这个区域不会产生内存溢出异常。 栈 java虚拟机栈 栈中主要存放了编译期可知的四类八种基本数据类型存(逻辑型 boo ...
分类:
其他好文 时间:
2018-07-21 19:51:49
阅读次数:
200
方法区 线程共享。 当JVM使用类装载器装载某个类时,首先获取class文件,提取该文件的内容信息,将这些信息存储到方法区,最后返回一个class实例。方法区用于存储已经被虚拟机加载的类信息(class)(版本,字段,方法,接口等描述信息),常量,静态变量(static),即时编译期编译后的代码数据等。称为“永久代”。GC在这区域较少出现,内存回收的主要目标是针对常量池的回收和对类的卸载(某个类不
分类:
其他好文 时间:
2018-07-21 17:18:26
阅读次数:
186
小伙伴们,又到周一啦,收拾好心情,准备工作了吗?今天跟大家一起来聊一聊Dagger2git地址:https://github.com/google/daggerDagger,起源于Square的Dagger,Dagger2是由谷歌接手开发;它是一个完全在编译期间进行的依赖注入框架,完全去除了反射;Dagger2通过依赖注入,让我们少写很多公式化代码,更容易测试,降低耦合,创建可复用可互换的模块;说
分类:
其他好文 时间:
2018-07-16 14:57:55
阅读次数:
131
1,通过使用静态字段,只有真正定义这个字段的类才会被初始化,(子类不初始化,父类初始化 2,new数组,不初始化 3,通过类来调用一些类的常量,可以不初始化类,(常量在编译期,被优化到NotInitialization类,成为了他的引用,所以可以不初始化 4,类和接口的初始化必要条件不同的是,接口可 ...
分类:
编程语言 时间:
2018-07-16 11:16:21
阅读次数:
135
泛型 为什么要有泛型, 在没有泛型之前, 什么东西充当了泛型的作用? 在泛型出现之前, 代码中会有很多需要强制转换的地方. 比如 int a = (int) object, 对于这样类似的代码, 编译器在编译期间无法确定是否是正确的代码, 只有在真正运行代码期间才会校验出来是否正确. 这种强制转换实 ...
assert assert 是运行期断言,它用来发现运行期间的错误,不能提前到编译期发现错误,也不具有强制性,也谈不上改善编译信息的可读性,既然是运行期检查,对性能当然是有影响的,所以经常在发行版本中,assert 都会被关掉。assert 的关键在于判断 expression 的逻辑真假,如果为 ...
分类:
编程语言 时间:
2018-07-11 23:30:36
阅读次数:
177