参考书籍:《深入理解java虚拟机》,三天时间用了八个小时看完,像读一本武侠小说,挺爽。

另外需声明:图片都是从我自己的csdn博客转载,所以虽然有csdn标识,但都是我自己画的图片。

java是半编译半解释的语言,.java首先编译为.class。通过一些二进制阅读软件,你可以去了解.class文件的内部构成。《深入理解java虚拟机》一书有专门章节讲这个,我觉得比较麻烦,不多说。

配合《深入理解java虚拟机》一书、类似这样的方式去了解.class文件里面的二进制信息,可以搞得很清楚(类信息怎样存、类成员变量怎样存、方法怎样存等等):

虚拟机类加载机制(java是半编译半解释的语言,.java文件首先编译为.class文件,由于编译是面向jvm的,所以这与C++的编译思路有些不同。只要编译为jvm能理解的就可以了,而非像C++那样编译为计算机可以执行的机器码。java的jvm才负责与真正的计算机交流,java程序则只需jvm能解读就可以了。所以这种半编译半解释的特性提供了很多C++所无法企及的灵活性。):

上图是java的加载机制。我们首先需要了解的是java类初始化(图中的Initialization)的时机(包括但不完全是这三种):

1,new

2,反射

3,初始化一个类时,若父类还未被初始化,先初始化其父类

而类的加载时机,则是最迟不晚于类的初始化时机。

类加载要做的事首先是通过类名(包括包),找到此类的.class二进制字节流。将该类信息加载到方法区(大抵仍是很原始的.class内容)。然后再内存中实例化一个java.lang.Class类对象(每一个类的信息在java中也是对象,这是很有哲学意味的一个概念)。这个java.lang.Class对象却并不是java堆中(虽然是对象),是存在方法区里。这个对象是程序访问方法区中类的对外接口。

在图中的的准备(Preparation)阶段,是对加载阶段的延续--同样是在方法区做事:初始化static变量。只分配内存空间,此时都是0值。

例如一个类中写到public static int value = 123; 则在准备阶段,publi static int value = 0;在初始化阶段才public static int value = 123;

但若为public static final int value = 123;则在准备阶段 便public static final int value = 123;

解析阶段是将常量池(《深入理解虚拟机》第六章介绍)内的符号引用(.class文件内的数据结构)转化为直接引用(真正对应虚拟机内存布局)

可以看出在初始化过程前,都是对类信息的加载、连接,也都是在方法区进行的。而从初始化阶段开始,真正涉及java执行引擎。

大致为下面这样的代码的话:

public class C
{private int b = 1; public static int a;public method1(){……}
}

java代码的执行主要基于栈结构(方法),而堆就是动态分配对象内存的地方,这些堆、栈的概念与C++相似。不同的是java是半解释型的语言。java程序是解释执行(之前的加载类信息过程也不仅仅是通过编译后的.class,可以通过jar包、网络、运行时计算生成例如动态代理、其它文件例如jsp)在jvm的执行引擎,而C++程序是直接执行在真实的计算机之上(编译为目标汇编后……)

这里引用一下《深入理解java虚拟机》中的一段话:

执行引擎是Java虚拟机最核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念。这两种机器都有代码执行的能力,其区别是物理机执行引擎是直接建立在处理器、硬件、指令集和操作系统层面上的,而虚拟机的执行引擎则是由自己实现的,因此可以自行制定指令集与执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式。

我之前画过一张基于C++语言反汇编来分析的栈空间示意图,画的是开辟新栈帧的过程,图中有些顺序没法表示清楚,先是参数入栈,然后ebp入栈,之后ebp指向esp,sub esp新栈帧长度、然后push ebx、esi、edi、局部变量入栈。

退出当前栈帧的过程与之相反。pop edi ,pop esi , pop ebx ,mov esp,ebp ,pop ebp 。之后,edi,esi,ebx恢复原来状态,ebp指向上一个栈帧栈底,esp指向上一个栈帧栈顶:

java虚拟机的栈帧结构与之有些差异,因为这是虚拟机,而非物理机(首先就不会用到物理机那些寄存器)。

首先我们要知道一点,在.java文件编译为.class文件的时候,.class文件里便已经定义了许多栈帧需要的信息:例如一个栈帧需要多大局部变量表、多深的操作数栈等等。

图上所说的方法的符号引用和直接引用可以大致这样理解:符号引用只是说明要调用哪个方法,而直接引用则是指明了方法在虚拟机里的内存地址。

符号引用向直接引用的转化有两种:其一是解析阶段(见本文第一张图)。另一种是动态连接(运行时确定)。前者基本就是编译阶段确定了类型,后者则是运行时确定类型。

动态确定方法,就是要靠图中栈帧里的“动态连接”区域来搞定。

java的“反汇编”(注意我是打了引号的),由此可以看出虚拟机在栈中怎样解释执行java方法的,用的是java虚拟机独有的“指令集”:

转载于:https://www.cnblogs.com/rixiang/p/5616929.html

java内功 ---- jvm虚拟机原理总结,侧重于虚拟机类加载执行系统相关推荐

  1. java中JVM的原理【转】

    一.java虚拟机的生命周期: Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序.程序开始执行时他才运行,程序结束时他就停止.你在同一台机器上运行三个程序,就会 ...

  2. java中JVM的原理

    一.Java虚拟机的生命周期: Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序.程序开始执行时他才运行,程序结束时他就停止.你在同一台机器上运行三个程序,就会 ...

  3. 揭秘Java虚拟机:JVM设计原理与实现

    网站 更多书籍点击进入>> CiCi岛 下载 电子版仅供预览及学习交流使用,下载后请24小时内删除,支持正版,喜欢的请购买正版书籍 电子书下载(皮皮云盘-点击"普通下载" ...

  4. 《Java虚拟机原理图解》5. JVM类加载器机制与类加载过程

    参考网址:http://blog.csdn.net/luanlouis/article/details/50529868 0.前言 读完本文,你将了解到: 一.为什么说Jabalpur语言是跨平台的 ...

  5. java虚拟机原理pdf_揭秘Java虚拟机 JVM设计原理与实现pdf

    揭秘Java虚拟机 JVM设计原理与实现 内容简介 <揭秘Java虚拟机:JVM设计原理与实现>从源码角度解读HotSpot的内部实现机制,本版本主要包含三大部分--JVM数据结构设计与实 ...

  6. JVM 虚拟机原理、Java 代码优化、秒杀系统

    JVM虚拟机原理 JVM组成架构 Java是一种跨平台的语言,JVM屏蔽了底层系统的不同,为Java字节码文件构造了一个统一的运行环境. Java 字节码文件 Java 如何实现在不同操作系统.不同硬 ...

  7. java中数组的内存模型_Java如何在内存有限的情况下实现一个超大数组?jvm性能调优+内存模型+虚拟机原理能解决什么样问题...

    在上一篇文章中,小编为您详细介绍了关于<变频器调速问题?三星R458更换CPU>相关知识.本篇中小编将再为您讲解标题Java如何在内存有限的情况下实现一个超大数组?jvm性能调优+内存模型 ...

  8. vilatile 深入理解java虚拟机_深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理)...

    本套课程从虚拟机的发展历史,虚拟机的内存结构,对象的分配与回收以及字节码,类加载等多个方面深入地对Java虚拟机进行了剖析.内容详实,语言通俗易懂.理论结合实践,让学习本套视频的朋友可以更快的理解虚拟 ...

  9. Java程序的运行原理及JVM的启动是多线程的吗?

    Java程序的运行原理及JVM的启动是多线程的吗? A:Java程序的运行原理 Java通过java命令会启动java虚拟机.启动JVM,等于启动了一个应用程序,也就是启动了一个进程. 该进程会自动启 ...

  10. JVM 内部原理(七)— Java 字节码基础之二

    JVM 内部原理(七)- Java 字节码基础之二 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...

最新文章

  1. 《数学建模:基于R》一一2.2 方差分析
  2. 表格数据清空还能恢复吗_数据恢复大师:清空回收站文件如何恢复?
  3. python图片-Python图片处理
  4. 设计模式——代理模式
  5. libevent -简单的异步IO介绍
  6. Linux内核--网络协议栈深入分析(二)--sk_buff的操作函数
  7. Python-读取文件例子:一个获取指定目录下一定格式的文件名称和文件修改时间并保存为文件的python脚本 ....
  8. 电源纹波分析及测试方法
  9. 用css实现三角效果
  10. mysql批量查询并替换或者更新某个字段
  11. BZOJ1423 : Optimus Prime
  12. h3c使用acl控制ftp访问_H3C访问控制列表(ACL)实例精华
  13. 【备忘】conda环境常用配置命令
  14. decimal在java中用什么类型,MYSQL数据库 的 decimal 字段类型 和 Java 的BigDecimal
  15. QQ互联一直显示“未提交审核”
  16. 【vant】爬坑引用本地图片
  17. 【每日力扣Leetcode】459-判断一个字符串是否由子字符串重复组成
  18. Julia REPL 模式
  19. python降序_Python中numpy如何进行降序?
  20. WinSCP 配置 WindowsTerminal 实现 WinSCP进行SSH

热门文章

  1. Sleep 方案解决主备延迟
  2. 读写分离架构的两种方式及问题
  3. 依赖注入框架(DI Framework)
  4. MyISAM存储引擎简介
  5. Linux开发_生成executable (application/x-executable)可执行程序
  6. 2017《JAVA》预备作业 计科1501班 王奕开
  7. mysql设置远程访问的权限
  8. C 使用异或(xor)加密/解密文件
  9. 对break和continue的一些个人认知(称不上见解)
  10. .net 统计图表和报表资源总结