Java编译器的常量优化】的更多相关文章

/* 在给变量进行赋值的时候,如果右侧的表达式当中全都是常量,没有任何变量, 那么编译器javac将会直接将若干个常量表达式计算得到结果. short result = 5 + 8; // 等号右边全都是常量,没有任何变量参与运算 编译之后,得到的.class字节码文件当中相当于[直接就是]: short result = 13; 右侧的常量结果数值,没有超过左侧范围,所以正确. 这称为“编译器的常量优化”. 但是注意:一旦表达式当中有变量参与,那么就不能进行这种优化了. */ public c…
优化1 对于byte/short/char三种类型来说,如果右侧赋值的数值没有超过范围,那么javac编译器将会自动隐含地为我们补上一个(byte)(short)(char). 如果没有超过左侧的范围,编译器补上强转. 如果右侧超过了左侧范围,那么直接编译器报错. 代码举例 public class MyDemo11Notice { public static void main(String[] args) { // 右侧确实是一个int数字,但是没有超过左侧的范围,就是正确的. // int…
public class Notice { public static void main(String[] args) { // 右侧20是一个int类型,但没有超过左侧数值范围,就是正确的 // int --> byte 不是自动类型转换 byte num1 = 20; System.out.println(num1); // 20 // 错误:不兼容的类型: 从int转换到byte可能会有损失 // byte num2 = 128; // System.out.println(num2);…
一.前言 随着Java编译器不断地向前发展,它为程序员们提供了越来越多的“蜜糖”(compiler suger),极大地方便了程序的开发,例如,foreach的增强模式,自动拆箱与装箱以及字符串的连接操作...... 这些"蜜糖"带给我们很多的便利,但是也存在着一些陷阱. 二.自动拆装箱陷阱 首先我们来看看大家最为熟悉的自动拆装箱(boxing),boxing可以自动帮我们完成基本类型和基本类型包裹器之间的转换. 具体使用方法可以参考有名的Java Gossip(http://open…
问题概括 静态常量可以再编译器确定字面量,但常量并不一定在编译期就确定了, 也可以在运行时确定,所以Java针对某些情况制定了常量优化机制. 常量优化机制 给一个变量赋值,如果等于号的右边是常量的表达式并且没有一个变量,那么就会在编译阶段计算该表达式的结果. 然后判断该表达式的结果是否在左边类型所表示范围内. 如果在,那么就赋值成功,如果不在,那么就赋值失败. 注意如果一旦有变量参与表达式,那么就不会有编译期间的常量优化机制. 结合问题,我们就可以大致猜出,如果常量能在编译期确定就会有优化,不能…
概述    最近在看jvm优化,总结一下学习的相关知识 (一)javac编译器 编译过程 1.解析与填充符号表过程 1).词法.语法分析    词法分析将源代码的字符流转变为标记集合,单个字符是程序编写过程的最小元素,而标记则是编译过程的最小元素,javac中由com.sun.tools.javac.parser.Scanner类实现    语法分析是根据token序列构造抽象语法树的过程.抽象语法树(AST)是一种用来描述程序代码语法结构的树形表示方式,语法树种的每一个节点都代表着程序代码中的…
首先看以下的代码: public static void main(String[] arge) { String str1 = new String("1234"); String str2 = new String("1234"); System.out.println("new String()==:" + (str1 == str2)); String str3 = "1234"; String str4 = &quo…
代码优化,可能说起来一些人觉得没用.可是我觉得应该平时开发过程中,就尽量要求自己,养成良好习惯,一个个小的优化点,积攒起来绝对是有大幅度效率提升的.好了,将平时看到用到总结的分享给大家. 代码优化的目标: 减小代码体积 提高整个系统的运行效率 代码细节优化 尽量指定类,方法的final修饰符 带有final修饰的类是不可派生的.在Java核心API中,有许多应用final的例子,例如java.lang.String,整个类都是final的.为类指定final修饰符可以让类不可以被继承,为方法指定…
前言 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑 的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了.代码优化也是一样,如果项目着眼于尽快无BUG上 线,那么此时可以抓大放小,代码的细节可以不精打细磨:但是如果有足够的时间开发.维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化 点累积起来,对于代码的运行效率绝对是有提升的. 代码优化的目标…
Java编译时常量和运行时常量 编译期常量指的就是程序在编译时就能确定这个常量的具体值. 非编译期常量就是程序在运行时才能确定常量的值,因此也称为运行时常量. 在Java中,编译期常量指的是用final关键字修饰的基本类型或String类型并直接赋值(非复杂运算)的变量(无论是否用static修饰),是编译器的一种优化,体现在字节码文件中:运行是常量是由运行时解释器解释完成的. 运行时常量很容易理解,接下来会简单的结合字节码文件来介绍编译时常量及使用风险. public class Consta…
java编译期优化 java语言的编译期其实是一段不确定的操作过程,因为它可以分为三类编译过程:1.前端编译:把.java文件转变为.class文件2.后端编译:把字节码转变为机器码3.静态提前编译:直接把*.java文件编译成本地机器代码从JDK1.3开始,虚拟机设计团队就把对性能的优化集中到了后端的即时编译中,这样可以让那些不是由Javac产生的Class文件(如JRuby.Groovy等语言的Class文件)也能享受到编译期优化所带来的好处Java中即时编译在运行期的优化过程对于程序运行来…
如果有足够的时间开发.维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率绝对是有提升的. 代码优化的目标是: 1.减小代码的体积 2.提高代码运行的效率 代码优化细节: 1.尽量指定类.方法的final修饰符 带有final修饰符的类是不可派生的.在Java核心API中,有许多应用final的例子,例如java.lang.String,整个类都是final的. 为类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被…
变量: 在Java中, 每一个变量属于一种类型. double salary int vacationDays; long earthPopulation; boolean done; 命名: 以字母开头, 由数字或者字母构成的序列(包括$,_) taps: 1. 不要在自己的代码中使用$, 只使用在Java编译器或其他工具生成的名字中. 2. 使用Character类的isJavaIdentifierStart和isJavaIdentifierPart方法进行检测. 3. 不能使用Java保留…
Java Interface 是常量存放的最佳地点吗?(转帖学习,非原创) 由于java interface中声明的字段在编译时会自动加上static final的修饰符,即声明为常量.因而interface通常是存放常量的最佳地点.然而在java的实际应用时却会产生一些问题. 问题的起因有两个,第一,是我们所使用的常量并不是一成不变的,而是相对于变量不能赋值改变.例如我们在一个工程初期定义常量∏=3.14,而由于计算精度的提高我们可能会重新定义∏=3.14159,此时整个项目对此常量的引用都应…
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/barryhappy/article/details/24442953 问题,以及一个解决方式 今天公司的JAVA项目碰到一个问题:在生成xls文件的时候.假设数据较多.会出现ArrayIndexOutOfBoundsException. Google发现是项中所用的jxl包(开源库,用以处理xls文件)的一个BUG. 也找到了一个解决的方法:http://www.blogjava.net/reev…
Java虚拟机(JVM)是可运行Java代码的假想计算机.只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行.本文首先简要介绍从Java文件的编译到最终执行的过程,随后对JVM规格描述作一说明. 一.Java源文件的编译.下载 .解释和执行  Java应用程序的开发周期包括编译.下载 .解释和执行几个部分.Java编译程序将Java源程序翻译为JVM可执行的字节码.这一编译过程同C/C++ 的编译有些不同.当C编译器编译生成一个对象的代码时,…
一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配.你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象. ------最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 堆栈(stack).位于通用RAM中,但通过它的“堆栈指针”可以从处理器哪里获得支持.堆栈指针若向下移动,则分配新的内存:若向上移动,则释放那…
JVM中有: Class文件常量池.运行时常量池.全局字符串常量池.基本类型包装类对象 常量池 Class文件常量池: class文件是一组以字节为单位的二进制数据流,在java代码的编译期间,编写的java文件就被编译为.class文件格式的二进制数据存放在磁盘中,其中包括class文件常量池. class文件中存在常量池(非运行时常量池),其在编译阶段就已经确定,jvm规范对class文件结构有着严格的规范,必须符合此规范的class文件才能被jvm认可和装载. 一下写个简单的类,并编译 p…
基础类型转化成String 在程序中你可能时常会需要将别的类型转化成String,有时候可能是一些基础类型的值.在拼接字符串的时候,如果你有两个或者多个基础类型的值需要放到前面,你需要显式的将第一个值转化成String(不然的话像System.out.println(1+’a')会输出98,而不是”1a”).当然了,有一组String.valueOf方法可以完成这个(或者是基础类型对应的包装类的方法),不过如果有更好的方法能少敲点代码的话,谁还会愿意这么写呢? 在基础类型前面拼接上一个空串(”"…
一.上文回顾 上回我们主要从图片的合并.压缩等方面介绍前端性能优化问题(详见Java Web 前端高性能优化(一)) 本次我们主要从图像BASE64 编码.GZIP压缩.懒加载与预加载以及 OneAPM Browser Insight 的定位分析功能四个方面介绍前端优化方法 二.图像的 BASE64 编码 不管如何,图片的下载始终都要向服务器发出请求,要是图片的下载不用向服务器发出请求,而可以随着 HTML 的下载同时下载到本地那就太好了.而目前,浏览器已经支持了该特性,我们可以将图片数据编码成…
java中的常量包括以下几类: 1.整型常量,比如:3,5,89,99 2.浮点型常量:比如1.23,5.98,3.1415926 3,字符常量:'a','c','1'(需要注意的一点是字符常量只能包含一个字符,并且要用单引号" ' " 括起来才可以.字符常量的长度是2个字节,也就是说字符常量'中'也是合法的) 4.字符串常量:"sun","china"等 5.布尔常量:他只有两个值 true 还有 false 6.null常量:也就是空常量,表…
当改变了jdk版本时,在编译java时,会遇到Unsupported major.minor version错误.错误信息如下 : Unsupported major.minor version 50.0Unsupported major.minor version 49.0 (我在jdk1.4 和1.5切换时就遇到了这个错误)Unsupported major.minor version 48.0 二.错误原因: 类似错误均属于Java版本问题,即JDK版本过低,只要选择相对应的JDK版本编译…
相关题目(运行结果在代码注释后面) 1. package StringTest; public class test1 { public static void main(String[] args){ String a = "a1";//“a1”在编译的时候就能确定,所以编译的时候,a1被放进了常量池中,同时a指向常量池中的a1对象 String b = "a"+ 1;//a和1这两个常量都能在编译时确定,所以他们相加的结果也能确定,因此编译器检查常量池中是否有值…
Java当中的常量池 在Java虚拟机jvm中,内存分布为:虚拟机堆,程序计数器,本地方法栈,虚拟机栈,方法区. 程序计数器是jvm执行程序的流水线,是用来存放一些指令的,本地方法栈是jvm操作系统方法所使用的栈,而虚拟机栈是用来执行程序代码的栈,在方法区中有类变量,类信息,方法信息,常量池(符号的引用,以表的形式存在的),堆是虚拟机执行程序代码的所用的堆. 常量?是一旦给定了值就无法改变的量,用final修饰的成员变量为常量. 什么是class文件常量池? 我们知道在class文件中,有类的版…
Class定义常量方法(推荐方法) //final修饰符 public final class Constants { //私有构造方法 private Constants() {} public static final int ConstantA = 100; public static final int ConstantB = 100; ...... } 采用“类.常量名”方法进行调用.需要私有化构造方法,避免创建该类的实例.同时不需让其他类继承该类. 如果多处需要访问工具类中定义的常量…
原文转载自美团从实际案例聊聊Java应用的GC优化,感谢原作者的贡献 当Java程序性能达不到既定目标,且其他优化手段都已经穷尽时,通常需要调整垃圾回收器来进一步提高性能,称为GC优化.但GC算法复杂,影响GC性能的参数众多,且参数调整又依赖于应用各自的特点,这些因素很大程度上增加了GC优化的难度. 即便如此,GC调优也不是无章可循,仍然有一些通用的思考方法.本篇会介绍这些通用的GC优化策略和相关实践案例,主要包括如下内容: 优化前准备: 简单回顾JVM相关知识.介绍GC优化的一些通用策略.优化…
Java是一个开放的平台,对于除发布编译器/解释器/基础类库之外,该语言的负责机构更多的是制定一系列标准,任何符合标准的厂商产品均可用于市场投放.甚至包括其编译器及解释器. (比如Hibernate提供了JPA实现:Tomcat实现了Java EE服务器标准,其Servlet容器通过了Java认证:各数据库或中间件厂商也根据JDBC接口开发驱动.说白了,Java基本就是都提供接口,然后让厂商开发实现,因此有时候我会骂,边骂边编码!) GCC有java编译器,可以看看. 我们主要主要介绍Eclip…
自动装箱与自动拆箱 首先要提到的便是 Java 的自动装箱(auto-boxing)和自动拆箱(auto-unboxing). 我们知道,Java 语言拥有 8 个基本类型,每个基本类型都有对应的包装(wrapper)类型. 之所以需要包装类型,是因为许多 Java 核心类库的 API 都是面向对象的.举个例子,Java 核心类库中的容器类,就只支持引用类型. 当需要一个能够存储数值的容器类时,我们往往定义一个存储包装类对象的容器. 对于基本类型的数值来说,我们需要先将其转换为对应的包装类,再存…
Java多线程--锁的优化 提高锁的性能 减少锁的持有时间 一个线程如果持有锁太长时间,其他线程就必须等待相应的时间,如果有多个线程都在等待该资源,整体性能必然下降.所有有必要减少单个线程持有锁的时间.比如下面的代码: public synchronized void someMethods() { fun1(); fun2(); // other code funNeedToSync(); // other code fun3(); fun4(); } 如果fun1~fun4都是耗时任务的话,…
作用: JVM:JVM有自己完善的硬件架构,如处理器.堆栈(Stack).寄存器等,还具有相应的指令系统(字节码就是一种指令格式).JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需要生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行.JVM是Java平台无关的基础.JVM负责运行字节码:JVM把每一条要执行的字节码交给解释器,翻译成对应的机器码,然后由解释器执行.JVM解释执行字节码文件就是JVM操作Java解释器进行解释执行字节码文件的过程. Jav…