【原创】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 = ...
随机推荐
- Hdfs block数据块大小的设置规则
1.概述 hadoop集群中文件的存储都是以块的形式存储在hdfs中. 2.默认值 从2.7.3版本开始block size的默认大小为128M,之前版本的默认值是64M. 3.如何修改block块的 ...
- FutureTask核心源码分析
本文主要介绍FutureTask中的核心方法,如果有错误,欢迎大家指出! 首先我们看一下在java中FutureTask的组织关系 我们看一下FutureTask中关键的成员变量以及其构造方法 //表 ...
- 总结下js排序算法和乱序算法
其实本人最怕的就是算法,大学算法课就感觉老师在讲天书,而且对于前端来说,算法在实际的应用中实在是很有限.毕竟算法要依靠大量的数据为基础才能发挥出算法的效率,就浏览器那性能,......是吧,退一万步说 ...
- RabbitMQ 入门 (Go) - 3. 模拟传感器,生成数据并发布
现在,我们需要模拟传感器,生成数据,并发布到 RabbitMQ. 建立传感器项目 在 GOPATH src 下建立文件夹 sensors,使用 go mod init 初始化,并创建 main.go. ...
- java例题_37 有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 3 问最后留下的是原来第几号的那位。
1 /*37 [程序 37 报数] 2 题目:有 n 个人围成一圈,顺序排号.从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 3 问最后留下的是原来第几号的那位. 4 */ 5 ...
- CVPR2021| 行人搜索中的第一个anchor-free模型:AlignPS
论文地址:https://arxiv.org/abs/2103.11617 代码地址:https://github.com/daodaofr/AlignPS 前言: 本文针对anchor-free模型 ...
- Spring Cloud 升级之路 - 2020.0.x - 2. 使用 Undertow 作为我们的 Web 服务容器
本项目代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 在我们的项目中,我 ...
- 2048小游戏(c++)(转)
下为源码 #include <iostream> #include <windows.h> #include <ctime> using namespace std ...
- [面试仓库]CSS面试题汇总-图文样式篇
图文样式这,我们挑了一个最常见的来说:line-height继承问题.从三个方面来考虑: 如果是具体的数值,则继承该数值 body{ font-size:32px; line-height:40p ...
- (十)struts2的异常处理机制
成熟的MVC框架应该提供成熟的异常处理机制.当然可以在方法中手动捕捉异常,当捕捉到特定异常时,返回特定逻辑视图名. 这种方式非常繁琐,需要在方法中写大量try catch块,最大的缺点还是一旦需要改变 ...