1. 前言-为何要再谈JVM
很多人认为,分布式Java应用看上去好像和Java虚拟机没什么太多关注的东西,别说分布式系统了,就是一个单机JavaSE系统也不用将JVM学得透透的,有个JVM执行不就行了吗。据笔者的经验回答则是,在大型分布式系统,尤其是云计算服务平台,SAAS也好,PAAS也罢,要求编写的应用必须要高效,你就当你运行的是一个配置很小的机器上,要求资源比较苛刻。所以了解,甚至再学习JVM相关知识还是十分必要的。之前笔者写过一篇关于JVM加载类的文章http://suhuanzheng7784877.iteye.com/blog/964784。后来发现这些还是不够的,还是需要在总结一下JVM运行时的其他环节。对于我们开发分布式的Java系统是有一种潜移默化的作用,主要用于自己回顾用。
2. JVM结构
JVM主要负责什么工作呢,首先它负责将我们编写的java文件编译成为class文件;第二它负责加载已有的class文件;第三它还负责class的执行;第四JVM还负责内存的分配与回收,这也是为什么大家在写代码的过程中不用手工写代码分配资源和强制回收资源了,有个强势的管家——JVM为您做了;JVM还要和底层操作系统接口进行交互完成多线程资源的同步、并发机制,所以为什么我们实现一个Runnable接口或者集成Thread就能完成多线程操作了,表面上看您除了编写一些特殊的类什么都没做,实际上是JVM为您默默做了那么多。
Sun,哦,不,笔者老是改不了口,Oracle的Java规范JVM如下:
Class文件被类加载器加载,JVM为其开辟内存空间,内存空间又分为四个大部分:方法区、堆区、栈区、本地方法栈区。JVM启动优先级比较小的线程来运行垃圾回收器,时刻监视并回收开辟的内存区域。
3. JVM到底如何编译Java代码
运行class文件需要将java文件编译成为class文件,JavaSDK如何编译的呢?javac将java源代码编译class过程如下:
1:分析输入到符号表:将java文件内容的字符串转变为关键字序列,之后生成一个类似于树状结构的内容,叫做抽象语法树。所谓输入到符号表的意思,就是将类中出现的符号输入类自身的符号表中等。所谓符号一般是指:父类、接口,因为要根据这些符号生成无参构造函数。
2:处理注解阶段:在JDK1.5之前,JVM没有这个阶段,但是JDK1.5之后咱们在Java类文件中写的注解需要JVM来进行处理、加强,至于注解保留到何时才生效,具体请参考http://suhuanzheng7784877.iteye.com/blog/1054838。
之后根据抽象语法树中等等信息联系到一起,进行有效性判断,一些列的语义判断,校验,优化某些代码,之后就是我们看到的class文件。class中除了字节码,还包括了JVM执行class的相关信息:
结构信息:class的文件格式版本号以及各部分的数量与大小。
元数据:元数据代表类的继承关系、接口、声明信息、属性、方法声明信息、常量池信息。
方法信息:包括字节码、异常处理表、局部变量区大小
我们利用反编译工具反编译一下以前自己写过的class源码,是不是发现确实JDK编译此文件的时候和我们源代码有些许出入,那是它为我们做了优化。
4. JVM到底如何执行Java代码
JVM执行class文件有3种方式,第一是解释执行、第二是编译执行、第三就是反射执行。可能大家对于第三个反射执行更为熟悉,因为这也是对大家相对真真正正编代码体验过的,而前两者都是由JVM给咱做的,所以听上去就十分陌生。
1):解析执行
在JVM中解析执行专门执行那些执行频率不高的代码,解析执行内部原理十分类似于咱们学过的汇编语言,JVM用一些自己自定义的指令(汇编语言也有自己一些简单的指令),来完成既有代码的执行过程,说白了,到了最底层,面向对象还是要过程化的。
通过4条常用指令完成对类的解析和执行。Invokestatic负责调用static方法,invokevirtual负责调用实例对象方法,invokeinterface对应的是调用接口方法,invokespecial负责private方法的调用以及编译源码后(就是class)生成的构造方法。
如下一段代码
import java.io.UnsupportedEncodingException;
public class UTest {
public static void main(String[] args) throws UnsupportedEncodingException {
String c = java.net.URLDecoder
.decode("%E4%BA%A7%E5%93%81%E6%8F%8F%E8%BF%B0%E5%9F%9F%E8%B6%8A%E7%95%8C","utf-8");
System.out.println(" " + c);
}
}
编译成class后,使用javap –c UTest看字节码内容
Compiled from "UTest.java"
public class UTest extends java.lang.Object{
public UTest();
Code:
0: aload_0//装载局部变量第一个值到操作数栈
1: invokespecial #8; //Method java/lang/Object."<init>":()V//初始化构造器
4: return
public static void main(java.lang.String[]) throws java.io.UnsupportedEncoding
Exception;
Code:
0: ldc #19; //String %E4%BA%A7%E5%93%81%E6%8F%8F%E8%BF%B0%E5%9F%9F%E8%B
6%8A%E7%95%8C//将字符串值装载到常量池中
2: ldc #21; //String utf-8//将字符串值装载到常量池中
4: invokestatic #23; //Method java/net/URLDecoder.decode:(Ljava/lang/Str
ing;Ljava/lang/String;)Ljava/lang/String;
//调用静态方法java.net.URLDecoder.decode
7: astore_1//将操作数栈中栈顶的值弹出放入局部变量区
8: getstatic #29; //Field java/lang/System.out:Ljava/io/PrintStream;
11: new #35; //class java/lang/StringBuilder
14: dup
15: ldc #37; //String
17:invokespecial #39; //Method java/lang/StringBuilder."<init>":(Ljava/la
ng/String;)V
20: aload_1
21:invokevirtual #42; //Method java/lang/StringBuilder.append:(Ljava/lang
/String;)Ljava/lang/StringBuilder;
24:invokevirtual #46; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;
27:invokevirtual #50;//Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V
30: return
}
估计大家都看烦了,习惯了面向对象思维的大家一看这种汇编似的语言确实头疼,耐不下心。如果不是搞JVM开发的,其实了解一下就可以,毕竟了解一下JVM运行原理,对于我们写代码,无异于又过了一层思考。
解释执行比较慢,但是呢,比较省资源,省内存,因为采用栈这种数据结构进行指令的收编和采集,运用,空间利用率可见是比较节俭的。
2):编译执行:
为了提升性能,JDK还可以编译执行,也叫做即时编译器,通常是对执行频率比较高的代码进行及时编译执行。编译执行牺牲了部分空间资源,换来的是优化了字节码的编译实际代码块,就是说我们编写的代码在JVM编译器看来是可优化的,所以它采用优化编译,将原先的代码进行一些调整,进而更好地利用JVM资源。编译执行那个主要分为2类,一个是客户端类型,属轻量级;一类是服务端类型,属于重量级。
(因篇幅原因,blog不能显示全部内容,请看Java分布式应用学习笔记02再谈JVM----续)
- 大小: 49.8 KB
- 大小: 28.9 KB
- 大小: 78.9 KB
分享到:
相关推荐
【Java分布式应用学习笔记-谈JVM】 在Java分布式应用中,JVM(Java虚拟机)扮演着至关重要的角色。虽然有些人可能认为分布式系统与JVM的关系并不密切,但事实上,尤其是在大型分布式环境,如云计算服务平台,对Java...
Java分布式应用学习笔记 在Java世界中,分布式应用是指由多个独立组件通过网络通信协同工作的系统。这种架构模式常用于构建大规模、高可用性、可扩展的系统。本笔记将深入探讨Java分布式应用的核心概念、技术和实践...
### Java分布式应用学习笔记03:JVM对线程的资源同步和交互机制 在深入探讨Java虚拟机(JVM)如何处理线程间的资源同步与交互机制之前,我们先来明确几个关键概念:线程、多线程、同步、并发以及它们在Java中的实现...
从给定的文件信息来看,标题和描述都指向了“Java分布式学习笔记01分布式Java应用”,这显然是关于Java在分布式环境下的应用和技术的学习资料。虽然提供的部分内容由于格式问题难以直接解析,但我们可以根据标题、...
"Java 学习笔记" Java 是一种面向对象的程序语言,具有跨平台的可能性。Java 的特性包括简单、面向对象、网络、解译、坚固、安全、可携和高效能。Java 平台包括 Java SE、Java EE 和 Java ME, Java SE 是 Java ...
### Java基础学习笔记知识点 #### 一、Java学习路线概览 Java学习通常分为几个阶段,从基础到高级,逐步深化。以下是对给定文件中提到的学习路线的详细解析: ##### 第一阶段:Java基础 - **JAVASE**:Java标准版...
JAVA学习笔记最新ppt版1 JAVA 是一种面向对象的程序语言,具有更高的跨平台可能性。它是 Sun 公司 GreenProject 中撰写 Star7 应用程序的一个程序语言,由 James Gosling 创造。Java 的特性包括简单、面向对象、...
"java校招学习笔记"显然是针对应届毕业生或求职者准备的,旨在帮助他们掌握Java的基础知识和校招面试中常见的技术问题。这份笔记可能包含了从基础概念到进阶主题的全面概述,以提高求职者的竞争力。 首先,Java的...
这些学习笔记涵盖了IT领域的多个关键知识点,让我们一一深入探讨。 首先,JVM(Java Virtual Machine)是Java程序运行的基础,它是Java平台的核心组成部分。理解JVM的工作原理对于优化Java应用程序性能至关重要。...
Java JDK 6学习笔记——PPT简体版是针对初学者和有经验的开发者们的一份宝贵资源,它深入浅出地介绍了Java编程语言的核心概念和技术。这份笔记以PPT的形式呈现,使得学习过程更加直观易懂,适合课堂教学或自我学习。...
本学习笔记旨在深入理解J2SE的基础概念、核心特性以及实际应用。 一、Java基础 Java是一种面向对象的编程语言,由Sun Microsystems(现已被Oracle收购)于1995年发布。它的主要特点包括跨平台性(Write Once, Run ...
Java学习笔记涵盖了许多核心的IT知识点,以下是这些主题的详细说明: **JVM(Java虚拟机)** Java虚拟机是Java程序运行的基础,它负责解释和执行字节码。理解JVM的工作原理对于优化程序性能至关重要。这包括类加载...
Java学习笔记概述 Java是一种广泛使用的高级编程语言,由Sun Microsystems(现为Oracle Corporation的一部分)于1995年发布。本笔记主要涵盖了在Java学习过程中涉及的关键知识点,包括技术基础、语言基础、面向对象...
【描述】:这套笔记以“狂神说”为特色,提供了详细的讲解和实例,让学习者能够从Java基础开始,逐步进阶到Java Web开发,再深入到Spring、MyBatis等主流框架的应用,最后涉及微服务技术,如Spring Boot和Dubbo的...
- Java提供了丰富的网络编程接口,使得开发者能够轻松地构建分布式应用。Socket编程支持可靠的流网络连接,使得Java在分布式计算中表现出色。 6. **Java版本**: - **Java SE(标准版)**:包含了Java的核心类库...
1. **早期阶段**:1995年,Sun Microsystems发布了Java的第一个版本,JVM作为其核心组成部分,主要应用于嵌入式设备和网络应用。初代JVM性能较低,但具备“一次编写,到处运行”的跨平台特性。 2. **HotSpot VM**:...