文档章节

Java执行原理

qingfeng哥
 qingfeng哥
发布于 2014/06/04 18:09
字数 1152
阅读 1068
收藏 26

先记录参考的文档,谢谢他们

 http://qing.blog.sina.com.cn/2494474521/94aea91933002vg2.html

http://www.importnew.com/1486.html 这个强烈推荐看


看个java文件编译和执行全程:

虚拟机是一种通过模拟方式来实现物理计算机体系架构的软件。

Java虚拟机是保障Java程序能跨平台运行的虚拟计算机。

Java虚拟机规范是对异构硬件、多样os 的 抽象、是一种 软件层次的计算机体系架构的约定描述,你可以依照该规范实现自己的java虚拟机。

通常的物理计算机体系架构是经典的冯诺依曼,基于寄存器的计算架构,能执行有限的机器指令码

jvm有自己的指令系统,jvm是基于堆栈的计算架构

Java堆栈要求Java程序执行中的每个线程都有一个独立的堆栈,每个当前执行的方法是当前线程堆栈的一个片断(Frame)
, 最终还是jvm将自己的指令翻译为物理计算机的机器指令才能执行的


不直接写机器指令码是因为难懂难记难看难维护

□ JVM和其它任何虚拟机一样,都是完成资源的封装,从而提高资源的利用率和可管理性。 
□ JVM是Java平台体系的核心基础设施。Java语言编写的程序在JVM上被解释和执行。 
□ JVM在JSR-924中进行了规范,在JSR-202中维护更新。JVM规范使JVM的具体实现和建立在JVM之上的应用之间耦合性降低。
 □ JVM规范主要从Java字节码规范、基本的执行过程、JVM指令集和抽象架构四个层面进行描述。 
 □ JVM实现中的关键问题是内存管理和垃圾回收、JVM指令到机器指令翻译方法、多线程支持

Java虚拟机根据jvm规范将Java源程序编译为jvm操作指令的Java字节码,这种指令不是机器码指令

在装有jvm的机器上,运行Java程序实际是jvm加载编译好的java字节码文件,然后将字节码文件中的指令翻译为机器码执行。


首先大概看一下JVM的抽象架构

可以看出jvm进程占用的物理内存 主要分为 四大块:

1、类加载器      :从入口处开始按需加载字节码文件,填充这些数据到运行时数据区

2、运行时数据区:核心区,堆heap和方法区所有线程共享的,pc计数器、java堆栈、本地方法栈线程独占

3、执行引擎     :jvm的cpu,不断地取指令(依据pc计数器),JIT编译翻译,执行

4、垃圾回收器   :这张图上没有,其实和执行引擎 一个 圈

外围

1、编译好的字节码文件,一般为.class

2、native功能库:nio引入基于channel和buffer的io方式,是使用native函数库直接在运行时数据区以外分配内存,通过一个存储在heap中的DirectByteBuffer对象作为这部分内存的引用,从而进行操作。这部分内存称为 直接内存


看看 java字节码.class 文件结构

类加载器 怎么加载类文件的,jvm的类加载采用父类委托制,子加载器能查询父加载器已缓存类,反之不行。

运行时数据区:

线程共享:
             对象实例、数组的内存分配都在 heap里,堆里的对象根据实现有句柄访问和直接指针访问两种方式
             方法区:类信息,静态变量、即时编译器编译后的代码数据,还包括常量池(字面量、符号引用),

线程私有: 程序计数器:存放jvm指令码的地址
               jvm堆栈:方法的内存模型(局部变量表、操作栈、动态链接、方法出口)
               本地方法栈


jvm栈中压入的是栈帧Frame这个frame包含了很多数据:局部变量、操作数栈、常用引用

除了pc计数器区 其他区都有可能产生oom,申请不到足够的内存了。
栈区还有可能stackoverflow,根据各个区存放的实体,可以写出针对各区oom和堆栈溢出的java代码


执行引擎,将字节码即时编译 优化 为本地代码, 然后执行



执行命令: java Test  背后到底做了什么








© 著作权归作者所有

共有 人打赏支持
qingfeng哥

qingfeng哥

粉丝 44
博文 124
码字总数 63706
作品 0
湛江
技术主管
加载中

评论(1)

蒋先生66
蒋先生66
写的太好了
[Java] JAVA和JVM运行原理

JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台,可以在上面执行java的字节码程序。 编译器负责把Jav...

枫兮兮
2014/03/12
0
0
sharding-jdbc源码分析—准备工作

原文作者:阿飞Javaer 原文链接:https://www.jianshu.com/p/7831817c1da8 接下来对sharding-jdbc源码的分析基于tag为源码,根据sharding-jdbc Features深入学习sharding-jdbc的几个主要特性...

飞哥-Javaer
05/03
0
0
升级到JDK9的一个BUG,你了解吗

概述 前几天在一个群里看到一个朋友发了一个demo,说是JDK的bug,昨天在JVM的一个群里又有朋友发了,觉得挺有意思,分享给大家,希望大家升级JDK的版本的时候注意下是否存在这样的代码,如果...

你假笨
06/06
0
0
编写你的第一个HelloWorld

写在前面的话 因为Java基础是以后学习框架的基石,因此开个文集首先写写Java基础,本来想直奔基础知识的介绍,但是为了保证知识的完整性,因此从Java安装和运行“hello world”开始(虽然百度...

nanaFighting
06/15
0
0
【Java并发专题】27篇文章详细总结Java并发基础知识

努力的意义,就是,在以后的日子里,放眼望去全是自己喜欢的人和事! github:https://github.com/CL0610/Java-concurrency,欢迎题issue和Pull request。所有的文档都是自己亲自码的,如果觉...

你听___
05/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

docker update:更新一个或多个容器的配置

更新容器的配置 docker update:更新一个或多个容器的配置。 具体内容请访问:https://docs.docker.com/engine/reference/commandline/update/#options 语法:docker update [OPTIONS] CONTA...

lwenhao
今天
1
0
unload事件

unload事件不触发的原因分析 1.代码位置不对,应该优先加载,不能放到回调函数中 2.浏览器不支持 3.最可能的原因,unload事件中触发的函数是一个异步执行的函数,浏览器是不允许在窗口关闭之后在...

狮子狗
今天
1
0
DbForge Schema Compare for MySQL入门教程:如何连接到数据库

【dbForge Schema Compare for MySQL下载】 要创建连接: 1. 在“Connection” 工具栏上单击“New Connection”按钮 。 2. 在“Host” 框中输入主机名。 3. 在“Port” 框中输入端口信息。默...

Miss_Hello_World
今天
1
0
spring中事务的应用

spring中事务管理的两种方式 编程式事务使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。 声明式事务是建立...

狂奔的熊二
今天
0
0
公众号关联微信小程序

公众号关联小程序发送关联通知,对于推广小程序有着很大的帮助。所以问题来了,怎么做到在公众号关联小程序发送关联通知呢? 一:开发中遇到的问题 之前在开发过程中发现,公众号已经关联小程...

Code辉
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部