文档章节

Java执行原理

qingfeng哥
 qingfeng哥
发布于 2014/06/04 18:09
字数 1152
阅读 1066
收藏 26
点赞 0
评论 1

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

 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
博文 122
码字总数 63706
作品 0
湛江
技术主管
加载中

评论(1)

蒋先生66
蒋先生66
写的太好了
sharding-jdbc源码分析—准备工作

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

飞哥-Javaer ⋅ 05/03 ⋅ 0

升级到JDK9的一个BUG,你了解吗

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

你假笨 ⋅ 06/06 ⋅ 0

编写你的第一个HelloWorld

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

nanaFighting ⋅ 06/15 ⋅ 0

Java 编程之美:并发编程高级篇之一

本文来自作者 追梦 在 GitChat 上分享 「Java 编程之美:并发编程高级篇之一」 编辑 | 工藤 前言 借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了。 ...

gitchat ⋅ 05/24 ⋅ 0

【Java并发专题】27篇文章详细总结Java并发基础知识

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

你听___ ⋅ 05/06 ⋅ 0

ThreadLocal趣谈 —— 杨过和他的四个冤家

一个一个上 一日醒来,杨过发现小龙女离家出走,于是外出寻找,不料碰上了金轮法王、李莫愁、裘千尺、公孙止四个冤家。 “哼,四个打我一个,算什么英雄好汉,有本事的,一个一个上!” 按照...

SexyCode ⋅ 06/12 ⋅ 0

书单丨5本Java后端技术书指引你快速进阶

一名Java开发工程师 不仅要对Java语言及特性有深层次的理解 而且需要掌握与Java相关的 框架、生态及后端开发知识 本文涉及多种后端开发需要掌握的技能 对于帮助提高开发能力非常有帮助 NO.1...

Java高级架构 ⋅ 05/30 ⋅ 0

Java并发编程之ThreadLocal源码分析

多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作的顺序是不可预期的,多线程访问同一个共享变量特别容易出现并发问题,特别是多个线程需要对一个...

狂小白 ⋅ 06/03 ⋅ 0

Java编程基础知识点和技术点归纳

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/23 ⋅ 0

ThreadLocal源码分析

阅读原文请访问我的博客 BrightLoong's Blog 一. 简介 提醒篇幅较大需耐心。 简介来自ThreadLocal类注释 ThreadLocal类提供了线程局部 (thread-local) 变量。这些变量与普通变量不同,每个线...

BrightLoong ⋅ 05/28 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Kubeflow实战系列:利用TFJob导出分布式TensorFlow模型

介绍 本系列将介绍如何在阿里云容器服务上运行Kubeflow, 本文介绍如何使用TfJob导出分布式模型训练模型。 第一篇:阿里云上使用JupyterHub 第二篇:阿里云上小试TFJob 第三篇:利用TFJob运行...

全部原谅 ⋅ 22分钟前 ⋅ 0

007. 深入JVM学习—老年代

老年代空间的主要目的是用于存储由Eden发送来的对象,一般在经历好几次“Minor GC”还会保存下来的对象,才会被复制到老年代,这样就可以存放更多的对象,同时在老年代中执行GC的次数也相对较...

影狼 ⋅ 23分钟前 ⋅ 0

常见的一些C#开源框架或者开源项目

原:https://blog.csdn.net/qq_27825451/article/details/70666044 Json.NET http://json.codeplex.com/ Json.Net 是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更......

whoisliang ⋅ 24分钟前 ⋅ 0

设计模式基本原理

刚开始接触编程这行的时候看过设计模式,当时感觉学这些模式没有太大的用处,当时也看不太懂。但是随着慢慢接触这一行,经过一段时间的编程以后,再回过头来看设计模式,发现设计模式的确是太...

王子城 ⋅ 28分钟前 ⋅ 0

阿里云全面支持IPv6!一文揽尽4位大咖精彩演讲

摘要: 自从去年11月以来,阿里巴巴高度重视数据中心的网络改造、云产品改造、应用及网络改造等多个维度,经过半年以来的建设,阿里云已经完成了域名解析等关键产品的分析,现在阿里云已经完...

传授知识的天使 ⋅ 38分钟前 ⋅ 0

windows Android sdk 配置

1、下载Android SDK,点击安装,直接默认路径即可! 下载地址:http://developer.android.com/sdk/index.html 2、默认路径安装后,安装完成,开始配置环境变量。 3、打开计算机属性——高级系...

阿豪boy ⋅ 41分钟前 ⋅ 0

bash shell script 简明教程

User <--> bash <--> kernel shell is not kernel or part of kernel various shells: tcsh, csh, bash, ksh find the using shell: echo $SHELL find all the shells: cat /etc/shells what......

mskk ⋅ 43分钟前 ⋅ 0

Service Mesh简史

William Morgan Service Mesh是一个相当新的概念,讲它的“历史”似乎有些勉强。就目前而言,Service Mesh已经在部分企业生产环境中运行了超过18个月,它的源头可以追溯到2010年前后互联网公...

好雨云帮 ⋅ 43分钟前 ⋅ 0

10个免费的服务器监控工具

监控你的WEB服务器或者WEB主机运行是否正常与健康是非常重要的。你要确保用户始终可以打开你的网站并且网速不慢。服务器监控工具允许你收集和分析有关你的Web服务器的数据。 有许多非常好的服...

李朝强 ⋅ 56分钟前 ⋅ 0

压缩工具之zip-tar

zip 支持目录压缩。使用yum安装zip包,使用yum安装unzip包 zip 1.txt.zip 1.txt #将1.txt文件压缩,新生成的压缩文件为1.txt.zip,原文件保留 zip -r 123.zip 123/ #-r对目录操作。将123/目录...

ZHENG-JY ⋅ 56分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部