【原创】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 = ...
随机推荐
- POJ_2828 Buy Tickets 【线段树】
一.题目 Buy Tickets 二.分析 首先可以明确的是每个人的位置都是定的,那么如果从输入数据从后往前看,最后面的人进来的时候,他前面的人数肯定是定的. 那么可以考虑,当从后往前推时,这个人插入 ...
- python实现顺序表
python实现顺序表可以有两中形式进行存储 列表 元组 其实简单来说,顺序表无非就是操作列表和元组的方法来对顺序表进行操作. 实例代码 7 class SqList: 8 def __init__( ...
- JAVA面试-计算机网络-TCP三次握手
学习原因 这个是面试的一个常问热点,所以务必要掌握. 通俗示例 小红是人事部门的员工,现在正在招收IT人员,小明看到招聘信息和待遇,感觉很适合自己,所以准备和小红发消息了解具体情况.而简历在本故事中代 ...
- K8S 本地 配置 Local PV 实践
上面我们创建了后端是 hostPath 类型的 PV 资源对象,我们也提到了,使用 hostPath 有一个局限性就是,我们的 Pod 不能随便漂移,需要固定到一个节点上,因为一旦漂移到其他节点上去了 ...
- 201871010113-贾荣娟 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 18级卓越班 这个作业要求链接 实验三-软件工程结对项目 这个课程学习目标 掌握软件开发流程,提高自身能力 这个作业在哪些方面帮助我实现了学习目标 本次实验让我对软件工程 ...
- Kafka优雅应用
Kafka API实战 注意版本问题这个,kafka-client要和kafka的版本一致 <dependency> <groupId>org.apache.kafka< ...
- DevEco Device Tool 2.1 Beta1 的Hi3861在Windows平台的编译体验
DevEco Device Tool迎来了2.1 Beta1,其中的亮点之一是:支持Hi3861开发板的源码在Windows平台编译.带着浓厚的兴趣,第一时间做了一次体验. 首先在官网下载" ...
- [源码分析] 分布式任务队列 Celery 之 发送Task & AMQP
[源码分析] 分布式任务队列 Celery 之 发送Task & AMQP 目录 [源码分析] 分布式任务队列 Celery 之 发送Task & AMQP 0x00 摘要 0x01 ...
- 解决Linux无法读写U盘中的NTFS问题
1 问题描述 由于笔者因为某些需要把Windows装在了U盘上面(在这里建议一下如果有需要请使用固态U盘),在Linux下挂载时,能读取但并不能写. 2 尝试的解决方案 2.1 remount 一开始 ...
- Day16_95_IO_循环读取文件字节流read()方法(四)
循环读取文件字节流read()方法(四) 使用 int read(byte[] bytes) 循环读取字节流数据 import java.io.FileInputStream; import java ...