唉~~因为blog总显示不全只能分为2个了,排版也不是很好,凑合着看吧。
客户端执行的优化策略有如下3种措施
方法内联:一个方法的执行离不开其他方法的支持,若调用的其他方法十分简单。那么调用的时候会将被调用那个方法里面所有的内容粘到主调方法中,这样做的好处是节省参数变量,中间变量的资源和返回值的资源申请位置。
private void test(){
test2("1");
}
private String test2(String a){
//test2的方法体
return null;
}
|
在JVM编译中会变成如下方式
private void test(){
//test2的方法体
}
|
去虚化处理:装载类的时候会进行类层次的分析,如果发现接口的方法是有一个实现类,那么JVM会说,别故弄玄虚了,就那么一个实现类,咱将实现类的方法实现内容全粘过来才是实在人,做人要厚道。
接口如下
public interface IA {
public void t();
}
|
实现类如下
public class A implements IA {
public void t(){
//做你想做的事情
}
}
|
下面是一个客户端调用类
class Demo{
public void execute(IA ia){
ia.t();
}
}
|
那么JVM去虚化会将此代码替换成
class Demo{
public void execute(IA ia){
//做你想做的事情
}
}
|
冗余消除:冗余消除是在编译期间发现代码可以进行折叠或者消除。
比如如下代码
public class A implements IA {
final static boolean isDebug = false;
public void t(){
if(isDebug){
System.out.println("容我三思");
}
System.out.println("全线出击");
}
}
|
反编译后的class内容如下
import java.io.PrintStream;
public class A
implements IA
{
static final boolean isDebug = false;
public void t()
{
System.out.println("全线出击");
}
}
|
编译期间可以确定代码不会执行到“容我三思”的步骤,您只能“全线出击”。
服务器模式编译则比客户端模式编译更加费资源,因为编译器模式的很多优化策略是从整体类运行出发的,主要优化点是标量替换、栈上分配、同步消除三项。这三项优化措施都是基于分析变量是否逃逸的分析结果。这些我们知道有这么个事情,了解一下即可,因为咱们还没到开发JVM的程度。
3):反射执行:
先回顾一下反射的代码,再来看看JVM如何处理反射执行的过程的
Class cls = Class.forName("java.lang.String");
Object obj = cls.newInstance();
Method method = cls.getMethod("valueOf", Object.class);
String str = (String) method.invoke(obj, 1);
System.out.println(str);
|
反射调用实际就是动态生成字节码,并加载到JVM中进行执行。流程如下:先让调用者所在的ClassLoader来加载创建Class对象,Class对象生出来了,之后校验Class是否为public权限的,如果不是,那么对不起,反射机制在伟大也不能违反原则,越雷池一步,不是public的类,您还是少碰为妙!之后JVM调用对象的newInstance方法,,该方法先去查找是否有缓存的ConstructorAccessor对象,如果没有则生成一个。生成ConstructorAccessor的过程需要MethodAccessorGenerator中的generate方法根据Class格式规范生成字节码,在生成字节码后,将其加载到ClassLoader中,并实例化完成对象的创建过程。之后就是寻遍方法数组,对照有没有要使用的”valueOf”方法,如果没有则抛出异常。如果有,则验证权限是否能暴露出来供反射调用,所以也是为什么反射调用执行稍微比直接对象调用方法有点慢的原因了。它需要验证使用权限,还要负责创建Method对象。传说是现在的JDK版本(Sun JDK1.6.26)在直接调用和反射调用的性能差别不大。这个笔者并没试过,改天有时间再做测试。
5. 总结
JVM内容很多,这次仅仅介绍了JVM编译、执行java代码的过程,类加载过程因为之前做过总结(http://suhuanzheng7784877.iteye.com/blog/964784)。了解了JVM编译,加载、执行的过程,以后我们写代码脑子里就多一层过滤,这是一种潜移默化的。JVM还有很多其他相关内容,比如JVM内存回收机制,也在笔者的blog:http://suhuanzheng7784877.iteye.com/blog/1000646做过相应的总结。在此不再赘述了。
分享到:
相关推荐
Java分布式应用学习笔记02再谈JVM
Java分布式应用学习笔记-谈JVM
Java分布式应用学习笔记03JVM对线程的资源同步和交互机制
本仓库是笔者在学习过程中的知识总结,内容以Java后端的知识总结为主。 【个人博客】 Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ 算法 操作系统 网络 数据库 Java JavaWeb 分布式 设计模式 算法 :pencil: 操作系统 :laptop: 网络 :...
Java架构面试专题及架构学习笔记 Dubbo服务框架面试专题及答案整理文档 BAT面试常问80题 23种设计模式知识要点整理 面试必备—API接口安全 面试必备—服务器推送技术 面试必备—匠心独运手写MyBatis框架 面试必备—...
30.简要谈一下您对微软.NET 构架下remoting和webservice两项技术的理解以及实际中的应用。 答:WS主要是可利用HTTP,穿透防火墙。而Remoting可以利用TCP/IP,二进制传送提高效率。 31.公司要求开发一个继承System....
Java学习笔记,内容包括JVM,spring,hashMap实现内核分析,多线程,剑指offer题解,设计模式。然后根据面试的重点,又将很多从里面抽出,专门整了个面试的分类,如果是看面试的东西的话,可以重点看这个。 编码字...
学习笔记较长,如果想查看文章的目录,chrome浏览器可以配合简悦插件使用,或者下载到本地使用Typora打开。 :hot_beverage: Java基础 Java容器 Java并发 数据结构和算法 数据结构 树 图 算法 分治 动态规划 回溯 ...
2020年Java基础教程(全资料+笔记+源码): 2020年javaweb全套教程: Mysql: Oracle: JDBC: C3P0: 前端技术 HTML、CSS、Javascript: jQuery-: Ajax: Vue: 微信小程序: 动态网页: 编程强化 JVM优化: 数据...
简单性、面向对象、可移植性、高性能、分布式、动态性、多线程、安全性、健壮性 Write Once、 Run Anywhere 二、JDK、JRE、 JVM JDK: Java Development Kit JRE: Java Runtime Environment JVM: Java Virtual ...
│ │ 深入理解Java内存模型.pdf │ │ │ └─课后资料 │ ├─笔记 │ │ 淘淘商城_day20_课堂笔记.docx │ │ │ └─视频 │ 07-使用Jedis连接集群操作.avi │ 00-今日大纲.avi │ 01-RDB持久化方式.avi │ 02...
直流笔记引言Dreamcats的公众号:面经助手包含面经,算法题和知识点,持续维护小程序涉及的源文件->秋招经历校招Java职位面试经历面经汇总知识体系刷题系列 :个人建议,如果时间不充足的情况下,将CS-Notes的...
超级玛丽java源码 公共内容 ...Java源码学习 JVM系列 JAVA 8 Action 1 2 JAVA NIO 1 2 开源项目 soul网关系列 数据库系列 PostgreSQL系列 工具使用 Git Tomcat Maven IntelljJ IDEA 压测工具 VSCode
Go语言学习笔记_雨痕 go-internals-zh steal 图解HTTP+彩色版 深入理解JVM&G1GC Java并发编程的艺术 java并发编程实战pdf及源码 Java虚拟机(第二版) 实战JAVA虚拟机JVM故障诊断与性能优化 HotSpot实战 Java虚拟机...
内容模组行动中的代码并发数据结构设计模式番石榴Java 8的通用的虚拟机吉尔分布式系统动物园管理员/策展人t4 《 Thinking in Java》一书的源代码书行动中的Java并发有效的Java(第二) Java 8实战用Java思考(第四)...
给大家分享一篇我在学习java过程中...包含常见的面试题:JVM、Java集合、多线程并发、java基础、SSM框架原理、微服务、Netty和RPC、网络、日志、算法、数据结构、加密、分布式算法、机器学习、大数据等知识点,都是干货
直流笔记 引言 Dreamcats的公众号: 常用网站 :一种新闻聚合的产品,个人感觉还不错,闲时可以看一下新闻,可选择订阅哦 面经助手 包含面经和算法题,持续维护 秋招经历 校招Java职位面试经历 面经汇总 知识...
JVM Java 类加载过程 Java 类加载机制 新生代频繁 gc 如何调整 CMS 垃圾回收器 锁 Lock 与 Sychronized 区别 Redis 分布式锁 Zookeeper 分布式锁 死锁产生原因 如何解决死锁 数据库死锁例子 JAVA 并发 AQS 源码 ...
Ability_Note概述本项目是Gudao的个人学习笔记记录着自己在IT届的成长过程学习路径GitHub项目中添加开源项目Gitgit中的高级命令MQActiveMQ安装并使用RabbitMQ安装,后期需补充说明RocketMQ介绍,后期需补充说明...