唉~~因为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分布式应用学习笔记-谈JVM】 在Java分布式应用中,JVM(Java虚拟机)扮演着至关重要的角色。虽然有些人可能认为分布式系统与JVM的关系并不密切,但事实上,尤其是在大型分布式环境,如云计算服务平台,对Java...
Java分布式应用学习笔记 在Java世界中,分布式应用是指由多个独立组件通过网络通信协同工作的系统。这种架构模式常用于构建大规模、高可用性、可扩展的系统。本笔记将深入探讨Java分布式应用的核心概念、技术和实践...
从给定的文件信息来看,标题和描述都指向了“Java分布式学习笔记01分布式Java应用”,这显然是关于Java在分布式环境下的应用和技术的学习资料。虽然提供的部分内容由于格式问题难以直接解析,但我们可以根据标题、...
### Java分布式应用学习笔记03:JVM对线程的资源同步和交互机制 在深入探讨Java虚拟机(JVM)如何处理线程间的资源同步与交互机制之前,我们先来明确几个关键概念:线程、多线程、同步、并发以及它们在Java中的实现...
- **Java EE** 提供了一系列服务、API 和协议,如 JSP、Servlet、Enterprise JavaBeans (EJB)、Java Remote Method Invocation (RMI) 等,这些技术共同构成了开发分布式、多层式、组件化和基于 Web 的应用程序的基础...
### Java基础学习笔记知识点 #### 一、Java学习路线概览 Java学习通常分为几个阶段,从基础到高级,逐步深化。以下是对给定文件中提到的学习路线的详细解析: ##### 第一阶段:Java基础 - **JAVASE**:Java标准版...
"Java 学习笔记" Java 是一种面向对象的程序语言,具有跨平台的可能性。Java 的特性包括简单、面向对象、网络、解译、坚固、安全、可携和高效能。Java 平台包括 Java SE、Java EE 和 Java ME, Java SE 是 Java ...
JAVA学习笔记最新ppt版1 JAVA 是一种面向对象的程序语言,具有更高的跨平台可能性。它是 Sun 公司 GreenProject 中撰写 Star7 应用程序的一个程序语言,由 James Gosling 创造。Java 的特性包括简单、面向对象、...
本压缩包文件“《java学习》-Java 学习笔记.zip”包含了丰富的学习资源,帮助初学者和进阶者深入理解Java编程。 1. **Java基础知识** - **语法**:Java的基础语法包括变量、数据类型、运算符、流程控制语句(如if-...
### Java+JDK+6 学习笔记知识点详解 #### 一、Java 概述 - **起源与发展:** - Java 最初是由 Sun Microsystems 的 Green Project 开发出来的编程语言,最初是为了创建一个名为 Star7 的应用程序。 - 1995 年 5 ...
"java校招学习笔记"显然是针对应届毕业生或求职者准备的,旨在帮助他们掌握Java的基础知识和校招面试中常见的技术问题。这份笔记可能包含了从基础概念到进阶主题的全面概述,以提高求职者的竞争力。 首先,Java的...
本文将根据"JVM性能学习笔记思维导图"的主题,详细阐述JVM的主要组成部分,性能调优的关键点以及相关的工具与实践策略。** 1. **JVM结构与内存模型** - **类装载器(ClassLoader)**:负责加载类文件,确保类在运行...
Java JDK 6学习笔记——PPT简体版是针对初学者和有经验的开发者们的一份宝贵资源,它深入浅出地介绍了Java编程语言的核心概念和技术。这份笔记以PPT的形式呈现,使得学习过程更加直观易懂,适合课堂教学或自我学习。...
Java学习笔记概述 Java是一种广泛使用的高级编程语言,由Sun Microsystems(现为Oracle Corporation的一部分)于1995年发布。本笔记主要涵盖了在Java学习过程中涉及的关键知识点,包括技术基础、语言基础、面向对象...
本学习笔记旨在深入理解J2SE的基础概念、核心特性以及实际应用。 一、Java基础 Java是一种面向对象的编程语言,由Sun Microsystems(现已被Oracle收购)于1995年发布。它的主要特点包括跨平台性(Write Once, Run ...