文档章节

Java执行原理

qingfeng哥
 qingfeng哥
发布于 2014/06/04 18:09
字数 1152
阅读 1079
收藏 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  背后到底做了什么








© 著作权归作者所有

共有 人打赏支持
下一篇: java技术体系
qingfeng哥

qingfeng哥

粉丝 44
博文 126
码字总数 64298
作品 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
编写你的第一个HelloWorld

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

nanaFighting
06/15
0
0
升级到JDK9的一个BUG,你了解吗

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

你假笨
06/06
0
0
Java虚拟机必学之四大知识要点你掌握了吗?

作为一位 Java 程序员,在尽情享受 Java 虚拟机带来好处的同时,我们还应该去了解和思考“这些技术特性是如何实现的”,去了解最底层的原理。只有熟悉 JVM,你才能在遇到 OutOfMemory 等异常...

Java干货分享
10/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

用any-loader封装jQuery的XHR —— 随便写着玩系列

哎,都说没人用JQuery啦,叫你别写这个。 其实我也是好高骛远使用过npm上某个和某个很出名的XHR库,嗯,认识我的人都知道我喜欢喷JQ,以前天天喷,见面第一句,你还用JQ,赶紧丢了吧。但我也...

曾建凯
今天
4
0
聊聊storm的AggregateProcessor的execute及finishBatch方法

序 本文主要研究一下storm的AggregateProcessor的execute及finishBatch方法 实例 TridentTopology topology = new TridentTopology(); topology.newStream("spout1", spout......

go4it
今天
3
0
大数据教程(7.5)hadoop中内置rpc框架的使用教程

博主上一篇博客分享了hadoop客户端java API的使用,本章节带领小伙伴们一起来体验下hadoop的内置rpc框架。首先,由于hadoop的内置rpc框架的设计目的是为了内部的组件提供rpc访问的功能,并不...

em_aaron
今天
5
0
CentOS7+git+github创建Python开发环境

1.准备CentOS7 (1)下载VMware Workstation https://pan.baidu.com/s/1miFU8mk (2)下载CentOS7镜像 https://mirrors.aliyun.com/centos/ (3)安装CentOS7系统 http://blog.51cto.com/fengyuns......

枫叶云
昨天
3
0
利用ibeetl 实现selectpicker 的三级联动

1. js 直接写在html页面上面,ibeetl 就可以动态地利用后台传上来的model List ,不需要每次点击都要ajax请求后台 2. 使用selectpicker 的时候,除了对selecct option的动态处理后,还需要 $("#...

donald121
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部