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分布式应用学习笔记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题解,设计模式。然后根据面试的重点,又将很多从里面抽出,专门整了个面试的分类,如果是看面试的东西的话,可以重点看这个。 编码字...
简单性、面向对象、可移植性、高性能、分布式、动态性、多线程、安全性、健壮性 Write Once、 Run Anywhere 二、JDK、JRE、 JVM JDK: Java Development Kit JRE: Java Runtime Environment JVM: Java Virtual ...
学习笔记较长,如果想查看文章的目录,chrome浏览器可以配合简悦插件使用,或者下载到本地使用Typora打开。 :hot_beverage: Java基础 Java容器 Java并发 数据结构和算法 数据结构 树 图 算法 分治 动态规划 回溯 ...
给大家分享一篇我在学习java过程中...包含常见的面试题:JVM、Java集合、多线程并发、java基础、SSM框架原理、微服务、Netty和RPC、网络、日志、算法、数据结构、加密、分布式算法、机器学习、大数据等知识点,都是干货
Ability_Note概述本项目是Gudao的个人学习笔记记录着自己在IT届的成长过程学习路径GitHub项目中添加开源项目Gitgit中的高级命令MQActiveMQ安装并使用RabbitMQ安装,后期需补充说明RocketMQ介绍,后期需补充说明...
直流笔记引言Dreamcats的公众号:面经助手包含面经,算法题和知识点,持续维护小程序涉及的源文件->秋招经历校招Java职位面试经历面经汇总知识体系刷题系列 :个人建议,如果时间不充足的情况下,将CS-Notes的...
超级玛丽java源码 公共内容 ...Java源码学习 JVM系列 JAVA 8 Action 1 2 JAVA NIO 1 2 开源项目 soul网关系列 数据库系列 PostgreSQL系列 工具使用 Git Tomcat Maven IntelljJ IDEA 压测工具 VSCode
内容模组行动中的代码并发数据结构设计模式番石榴Java 8的通用的虚拟机吉尔分布式系统动物园管理员/策展人t4 《 Thinking in Java》一书的源代码书行动中的Java并发有效的Java(第二) Java 8实战用Java思考(第四)...
直流笔记 引言 Dreamcats的公众号: 常用网站 :一种新闻聚合的产品,个人感觉还不错,闲时可以看一下新闻,可选择订阅哦 ...Java面试思维导图(包括分布式架构) 吐血系列 项目 其他 前端面试 其他 额外
2020年Java基础教程(全资料+笔记+源码): 2020年javaweb全套教程: Mysql: Oracle: JDBC: C3P0: 前端技术 HTML、CSS、Javascript: jQuery-: Ajax: Vue: 微信小程序: 动态网页: 编程强化 JVM优化: 数据...
│ │ 深入理解Java内存模型.pdf │ │ │ └─课后资料 │ ├─笔记 │ │ 淘淘商城_day20_课堂笔记.docx │ │ │ └─视频 │ 07-使用Jedis连接集群操作.avi │ 00-今日大纲.avi │ 01-RDB持久化方式.avi │ 02...
JVM Java 类加载过程 Java 类加载机制 新生代频繁 gc 如何调整 CMS 垃圾回收器 锁 Lock 与 Sychronized 区别 Redis 分布式锁 Zookeeper 分布式锁 死锁产生原因 如何解决死锁 数据库死锁例子 JAVA 并发 AQS 源码 ...
此项目是利用业余时间,对一些技术知识点进行整理,用来记录个人学习笔记。这个项目和 项目的不同在于 是用来动手实践,对于一些技术的实际搭建和造轮子的项目,正所谓实践出真知。相关的源码都会在上边。两个项目...