【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的及时编译器有两种:c1编译器和c2编译器,两种编译器的巨鳖如下:

      • 1、c1编译器又叫client编译器,编译器会对字节码进行简单高效的编译,编译时间短,适用于对启动性能要求高的场景,执行参数:-client。
      • 2、c2编译器又叫server编译器,编译器会对字节码进行过度编译,编译时间久,适用于对峰值性能要求高的场景,执行参数:-server。
    • c1编译器和c2编译器的优化策略区别如下:
      • 1、c1编译器主要通过内联、去虚拟化、消除冗余的方式进行优化。

        • 内联:将引用方法编译到引点位置,减少栈帧的产生、参数传递产生的性能损耗。
        • 去虚拟化:针对唯一子类进行内联。
        • 消除冗余:折叠无用的代码。
      • 2、c2编译器主要是基于对象的逃逸分析,进行编译优化
        • 栈上分配:针对没有产生方法逃逸的对象,进行栈上分配而非堆分配,以减少垃圾对象回收带来的性能损耗。
        • 同步清除:针对没有产生线程逃逸的对象,消除同步限制。
        • 标量替换:用标量替换对象的创建,减少垃圾对象回收。
  • 逃逸分析可以分为方法逃逸和线程逃逸两种方式:

    • 方法逃逸:(1)方法内创建的对象,没有作为参数传递给其他方法;(2)方法内创建的对象没有作为返回值返回。
    • 线程逃逸:一个对象只会被单个线程访问。
    • 逃逸分析相关参数:
      • 逃逸分析:-XX:+DoEscapeAnalysis
      • 标量替换:-XX:+EliminateAllocations
      • 同步消除:-XX:+EliminateLocks

【原创】JVM如何运行Java程序的?的更多相关文章

  1. 在云端服务器centos7安装jvm并且运行java程序

    (1)在云端服务器 下载jdk http://www.linuxidc.com/Linux/2016-09/134941.htm(大致看这个文章后可以下载一个jdk的压缩包,然后将压缩包解压) 然后, ...

  2. Java魔法堂:以Windows服务的形式运行Java程序

    一.前言 由于防止维护人员误操作关闭Java控制台程序,因此决定将其改造为以Windows服务的形式运行.弄了一个上午总算搞定了,下面记录下来,以供日后查阅. 二.Java Service Wrapp ...

  3. 在 Sublime Text 3 中配置编译和运行 Java 程序

    参考网址:http://www.open-open.com/lib/view/open1388105023765.html 1. 设置 java 的 PATH 环境变量 2. 创建批处理或 Shell ...

  4. JAVA设置环境变量和在DOS下运行java程序

    在学校实训的这几天,老师带着我们开始深入的复习java.这是第一天的内容哦 对于“JAVA设置环境变量和在DOS下运行java程序”,许多初学者是陌生的,但了解这个却对后期的学习很重要. http:/ ...

  5. 【转】如何配置EditPlus中Java运行环境,运行Java程序

    如何配置EditPlus中Java运行环境,运行Java程序 http://jingyan.baidu.com/article/86112f13725e2e2736978711.html 分步阅读 E ...

  6. cmd 窗口中运行 Java 程序

    1.CMD 命令提示符(Command Processor)(CMD) CMD命令:开始->运行->键入 cmd(在命令行里可以看到系统版本.文件系统版本) 2.对文件夹操作的部分命令 启 ...

  7. java学习笔记(1)java的基础介绍 、JDK下载、配置环境变量、运行java程序

    java工程师是开发软件的 什么是软件呢? 计算机包括两部分: 硬件: 鼠标.键盘.显示器.主机箱内部的cpu.内存条.硬盘等 软件: 软件包括:系统软件和应用软件 系统软件:直接和硬件交互的软件:w ...

  8. IDEA部署项目,并结合Shell脚本运行Java程序

    一.概述 在实际开发中,我们写好的代码,往往打成war包或jar包,通过winscp或其他软件将其上传至服务器,然而这样非常大的一个弊端就是不利于开发,为什么这么说呢?假如我们刚刚将springboo ...

  9. Docker极简入门:使用Docker运行Java程序

    运行简单的Java程序 先在当前目录创建App.java文件 public class App{ public static void main(String[] args){ String os = ...

随机推荐

  1. python基础学习之类的属性 增删改查

    类中的属性如何在类外部使用代码进行增删改查呢 增加.改变: setattr内置函数以及 __setattr__魔法方法 class A: aaa = '疏楼龙宿' a = A() setattr(a, ...

  2. Centos7 Firewall 使用笔记

    在 Centos 7 中防火墙由 firewalld 来管理,而不是以前的 iptables. 记录一下常用操作备查 firewall-cmd 操作 firewall-cmd --state 查看防火 ...

  3. 2018ICPC南京K. Kangaroo Puzzle

    题目:在一个20×20的地图上,1表示有袋鼠,0表示有障碍物,边界外和障碍物上不能走.        要求给出一个50000步以内的操作,每一步操作为'L', 'R', 'U', 'D', 表示所有袋 ...

  4. 采用React + Fabric + ImageMagick 实现大图片DIY定制

    一,需求背景: 某个印刷公司,有一系列的设计文件模板.接到客户订单时,就在这些设计文件模板上,做一些简单的定制,就能够满足客户的印刷需求. 如在设计文件模板上添加客户的Logo,二维码,联系方式等. ...

  5. MyEclipse安装过程

    1.安装JDK并配置环境变量 下载地址: https://www.oracle.com/technetwork/java/javase/downloads/index.html ①点击download ...

  6. 攻防世界 resver catch-me

    catch-me asis-ctf-quals-2016 附件给了个压缩包文件,重命名,解压,获取到elf文件 程序有两处关键比较 第一处: 这里进行动态调试,得到v3=0xB11924E1, byt ...

  7. Git - 使用命令和P4Merge进行diff

    P4Merge P4Merge是Git的一个第三发Diff和Merge工具(可视化冲突解决工具). 下载地址: https://www.perforce.com/downloads/visual-me ...

  8. 【FreeRTOS】cpu利用率统计

    目录 前言 概念 作用 必看点 实现 添加几个宏定义 源码 FreeRTOS STM32 定时器 简要说明 前言 本笔记基于 stm32+FreeRTOS. 主要参考野火.安富莱. 概念 简单概要: ...

  9. 【LiteOS】LiteOS任务篇-源码分析-创建任务函数

    目录 前言 链接 参考 笔录草稿 部分源码分析 源码分析 LOS_TaskCreate函数 LOS_TaskCreateOnly函数 宏 OS_TCB_FROM_PENDLIST 和 宏 LOS_DL ...

  10. 为科学计算而生的Julia——基于Manjaro Linux的安装与入门

    技术背景 Julia是一门为科学计算而生的编程语言,其着重强调了开源.生态与性能.从开源角度来说,相比于Matlab就要友好很多,用户可以免费使用,而且MIT协议应该是最宽松的开源协议之一(截图来自于 ...