【原创】JVM如何运行Java程序的?
【Deerhang】
我们知道Java程序的运行是依赖于JVM虚拟机的,JVM类语言经过编译生成class字节码文件,字节码又经JVM进一步的编译生成机器码,最终运行在硬件上。那么JVM存在的意义是什么?
- 拿Java语言为例,Java是一门高级的计算机语言,它的实现复杂、抽象程度高,是无法将这种高级语言生成的程序直接运行在硬件上的,需要JVM替我们进行进一步的编译才可以实现。
- JVM替提供了一个托管环境,这个托管环境替代我们处理了一些冗长且容易出错的逻辑判断(类似于数组越界),我们的重心可以更多的放在业务代码上。托管环境提供的最重要的功能就是垃圾回收和内存自动分配。
class字节码文件无法直接运行在硬件上,需要经过JVM进一步编译才能运行,那么JVM是如何编译字节码文件的呢?
- 首先字节码文件会被加载到JVM的方法区中,程序运行时所需的类文件全部从方法区中获得。 JVM使用解释执行和及时编译两种方式对字节码进行编译,两种编译的区别如下
- 1、 解释执行:将字节码逐翻译成机器码执行,翻译策略与解释性语言相同,如Python、JavaScript,特点是运行无需等待编译,可以直接执行。执行参数:-Xint,-Xint会开启JVM的解释执行策略,降低程序的执行性能。
- 2、即使编译:将整段代码编译成机器码,真正运行的时候直接执行的是机器码,及时编译的特点是实际运行速度更快。执行参数:-Xcomp,-Xcomp会开启JVM的及时编译策略,一次性将字节码编译成机器码,以换取做高的执行效率
- 3、混合模式:混合模式默认使用了解释执行和及时编译,先使用解释执行执行字节码,然后使用及时编译对热点数据进行编译。JDK默认使用混合模式,对应的参数是:-Xmixed
- 首先字节码文件会被加载到JVM的方法区中,程序运行时所需的类文件全部从方法区中获得。 JVM使用解释执行和及时编译两种方式对字节码进行编译,两种编译的区别如下
JVM如何提升程序执行效率
- JVM应用及时编译技术,对字节码的编译进行优化,以提升启动性能和峰值性能。JVM的及时编译器有两种:c1编译器和c2编译器,两种编译器的巨鳖如下:
- 1、c1编译器又叫client编译器,编译器会对字节码进行简单高效的编译,编译时间短,适用于对启动性能要求高的场景,执行参数:-client。
- 2、c2编译器又叫server编译器,编译器会对字节码进行过度编译,编译时间久,适用于对峰值性能要求高的场景,执行参数:-server。
- c1编译器和c2编译器的优化策略区别如下:
- 1、c1编译器主要通过内联、去虚拟化、消除冗余的方式进行优化。
- 内联:将引用方法编译到引点位置,减少栈帧的产生、参数传递产生的性能损耗。
- 去虚拟化:针对唯一子类进行内联。
- 消除冗余:折叠无用的代码。
- 2、c2编译器主要是基于对象的逃逸分析,进行编译优化
- 栈上分配:针对没有产生方法逃逸的对象,进行栈上分配而非堆分配,以减少垃圾对象回收带来的性能损耗。
- 同步清除:针对没有产生线程逃逸的对象,消除同步限制。
- 标量替换:用标量替换对象的创建,减少垃圾对象回收。
- 1、c1编译器主要通过内联、去虚拟化、消除冗余的方式进行优化。
- JVM应用及时编译技术,对字节码的编译进行优化,以提升启动性能和峰值性能。JVM的及时编译器有两种:c1编译器和c2编译器,两种编译器的巨鳖如下:
逃逸分析可以分为方法逃逸和线程逃逸两种方式:
- 方法逃逸:(1)方法内创建的对象,没有作为参数传递给其他方法;(2)方法内创建的对象没有作为返回值返回。
- 线程逃逸:一个对象只会被单个线程访问。
- 逃逸分析相关参数:
- 逃逸分析:-XX:+DoEscapeAnalysis
- 标量替换:-XX:+EliminateAllocations
- 同步消除:-XX:+EliminateLocks
【原创】JVM如何运行Java程序的?的更多相关文章
- 在云端服务器centos7安装jvm并且运行java程序
(1)在云端服务器 下载jdk http://www.linuxidc.com/Linux/2016-09/134941.htm(大致看这个文章后可以下载一个jdk的压缩包,然后将压缩包解压) 然后, ...
- Java魔法堂:以Windows服务的形式运行Java程序
一.前言 由于防止维护人员误操作关闭Java控制台程序,因此决定将其改造为以Windows服务的形式运行.弄了一个上午总算搞定了,下面记录下来,以供日后查阅. 二.Java Service Wrapp ...
- 在 Sublime Text 3 中配置编译和运行 Java 程序
参考网址:http://www.open-open.com/lib/view/open1388105023765.html 1. 设置 java 的 PATH 环境变量 2. 创建批处理或 Shell ...
- JAVA设置环境变量和在DOS下运行java程序
在学校实训的这几天,老师带着我们开始深入的复习java.这是第一天的内容哦 对于“JAVA设置环境变量和在DOS下运行java程序”,许多初学者是陌生的,但了解这个却对后期的学习很重要. http:/ ...
- 【转】如何配置EditPlus中Java运行环境,运行Java程序
如何配置EditPlus中Java运行环境,运行Java程序 http://jingyan.baidu.com/article/86112f13725e2e2736978711.html 分步阅读 E ...
- cmd 窗口中运行 Java 程序
1.CMD 命令提示符(Command Processor)(CMD) CMD命令:开始->运行->键入 cmd(在命令行里可以看到系统版本.文件系统版本) 2.对文件夹操作的部分命令 启 ...
- java学习笔记(1)java的基础介绍 、JDK下载、配置环境变量、运行java程序
java工程师是开发软件的 什么是软件呢? 计算机包括两部分: 硬件: 鼠标.键盘.显示器.主机箱内部的cpu.内存条.硬盘等 软件: 软件包括:系统软件和应用软件 系统软件:直接和硬件交互的软件:w ...
- IDEA部署项目,并结合Shell脚本运行Java程序
一.概述 在实际开发中,我们写好的代码,往往打成war包或jar包,通过winscp或其他软件将其上传至服务器,然而这样非常大的一个弊端就是不利于开发,为什么这么说呢?假如我们刚刚将springboo ...
- Docker极简入门:使用Docker运行Java程序
运行简单的Java程序 先在当前目录创建App.java文件 public class App{ public static void main(String[] args){ String os = ...
随机推荐
- “/”应用程序中的服务器错误。||分析器错误消息: 未能加载类型“WebApplication1._Default”
环境VS2008 无法运行WEB项目,Winfrom程序OK. 新创建的WEB项目直接运行报下图错误. 尝试多种方法: 1,重新生成项目,运行.(失败) 2,重装VS2008(默认.完全.自定义)安装 ...
- Dotnet洋葱架构实践
一个很清晰的架构实践,同时刨刨MySQL的坑. 一.洋葱架构简介 洋葱架构出来的其实有一点年头了.大约在2017年下半年,就有相关的说法了.不过,大量的文章在于理论性的讨论,而我们今天会用一个项目 ...
- 仿String()构造器函数 【总结】
需求 实现以下方法: 控制台结果: 需求分析: 首先确定new调用的this和什么对象绑定,如果跟默认返回的对象绑定肯定做不到 [ ] 这样的访问,所以要在构造器内部返回一个包装过的数组 1.leng ...
- 【JVM进阶之路】一:Java虚拟机概览
1.Java简史 Java语言是一门通用的.面向对象的.支持并发的程序语言.全球从事Java相关开发的人员已经数以百万计. 从1995年"Java"正式出现以来,Java已经经历了 ...
- 攻防世界 reverse 进阶 9-re1-100
9.re1-100 1 if ( numRead ) 2 { 3 if ( childCheckDebugResult() ) 4 { 5 responseFalse(); 6 } 7 else if ...
- Python爬虫系列之爬取美团美食板块商家数据(一)
主要思路 目的: 根据输入的城市名,爬取该城市美团美食板块所有商家的数据.数据包括: 店名.评分.评论数量.均价.地址, 并将这些数据存入Excel中. 最后尝试对爬取到的数据做一个简单的分析. 克服 ...
- Java基础回顾_第二部分_Java流程控制
Java基础回顾_第二部分 Java流程控制 Scanner对象(扫描器,捕获输入) import java.util.Scanner; public class Demo01 { public st ...
- SIP (Session Initiation Protocol) 协议
Session Initiation Protocol 介绍 SIP是VoIP技术最常使用的协议,它是一种应用程序层协议,可与其他应用程序层协议配合使用,以控制Internet上的多媒体通信会话. V ...
- CodeForces CF862E题解
\(Part\ 1:\) 我们发现每次修改动的是\(a\)串,所以对于这个答案的公式,\(b_{i+j}\)的部分是可以求出来的.所以我们可以把公式改成如下所示: \(f(j)=|\sum_{i=1} ...
- [树形DP]二叉苹果树
二 叉 苹 果 树 二叉苹果树 二叉苹果树 题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定 ...