你应该知道的关于 HotSpot VM 的内容

目录

  • 1 HotSpot VM的历史
  • 2 HotSpot VM 概述

1 HotSpot VM的历史

Oracle/Sun JDK 中使用的 JVM 是 HotSpot VM.

SUN 的 JDK 版本从 1.3.1 开始采用 HotSpot 虚拟机, 并于 2006 年底开源, 主要使用C++实现, JNI 接口部分用C实现.

HotSpot 是较新的 JVM, 用来替代 JIT (Just in Time, 即时编译), 可以大大提高 Java 的运行性能, 即:

Java 起初是把源代码编译为 .class 格式的字节码在虚拟机上执行, 速度较慢;

HotSpot 将常用的部分代码编译为本地(native)代码, 显著提高了性能.

HotSpot JVM 参数分为标准参数(standard options)、非标准参数(non-standard options) 以及非稳定参数, 可参考: GC学习入门 看这一篇就够了(基于Oracle JDK 8)

2 HotSpot VM 概述

HotSpot 包括一个解释器和两个编译器(client 和 server, 实际运行中二选一), 解释与编译混合执行模式, 默认启动解释执行.

编译器: Java 源代码被编译器编译成 class 字节码文件, Java 字节码在运行时可以被动态编译(JIT)成本地代码(前提是解释与编译混合执行模式且虚拟机不是刚启动时).

解释器: 解释器用来解释 class 字节码文件, Java是解释型语言(区别于编译型语言).

① 解释型语言 编写的程序在运行时才编译, 再由专门的解释器解释执行 —— 每执行一次就要编译一次, 效率比较低.

② 编译型语言 编写的程序在运行前, 需要通过编译器将代码编译成机器语言, 然后直接由相应的操作系统执行.

这类语言编写的程序执行速度快, 同等条件下对系统要求较低, 因此像开发操作系统、大型应用程序、数据库系统等时都采用它, 如C/C++、Pascal等都是编译语言.

而一些网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序则通常使用解释性语言,如Java、JavaScript、VBScript、Perl、Python、Ruby、MATLAB 等等。 [2]

解释性语言,例如java语言,java程序首先通过编译器编译成class文件,如果在windows平台上运行,则通过windows平台上的java虚拟机(VM)进行解释。如果运行在linux平台上,则通过linux平台上的java虚拟机进行解释执行。所以说能跨平台,前提是平台上必须要有相匹配的java虚拟机。如果没有java虚拟机,则不能进行跨平台。 [2]

server启动慢,占用内存多,执行效率高,适用于服务器端应用;

client启动快,占用内存小,执行效率没有server快,默认情况下不进行动态编译,适用于桌面应用程序。

java -version
Java HotSpot(TM) Client VM (build 14.3-b01, mixed mode, sharing)
mixed mode 解释与编译 混合的执行模式 默认使用这种模式

java -Xint -version

Java HotSpot(TM) Client VM (build 14.3-b01, interpreted mode, sharing)

interpreted 纯解释模式 禁用JIT编译

java -Xcomp -version

Java HotSpot(TM) Client VM (build 14.3-b01, compiled mode, sharing)

compiled 纯编译模式(如果方法无法编译,则回退到解释模式执行无法编译的方法)

3.动态编译

? 动态编译(compile during run-time),英文称Dynamic compilation;Just In Time也是这个意思。

? HotSpot对bytecode的编译不是在程序运行前编译的,而是在程序运行过程中编译的。
? HotSpot里运行着一个监视器(Profile Monitor),用来监视程序的运行状况。

? java字节码(class文件)是以解释的方式被加载到虚拟机中(默认启动时解释执行)。 程序运行过程中,那一部分运用频率大,那些对程序的性能影响重要。对程序运行效率影响大的代码,称为热点(hotspot),HotSpot会把这些热点动态地编译成机器码(native code),同时对机器码进行优化,从而提高运行效率。对那些较少运行的代码,HotSpot就不会把他们编译。

? HotSpot对字节码有三层处理:不编译(字节码加载到虚拟机中时的状态。也就是当虚拟机执行的时候再编译),编译(把字节码编译成本地代码。虚拟机执行的时候已经编译好了,不要再编译了),编译并优化(不但把字节码编译成本地代码,而且还进行了优化)。

? 至于那些程序那些不编译,那些编译,那些优化,则是由监视器(Profile Monitor)决定。

4.为什么不静态编译那?

? 为什么字节码在装载到虚拟机之前就编译成本地代码那?

? 动态编译器也在许多方面比静态编译器优越。静态编译器通常很难准确预知程序运行过程中究竟什么部分最需要优化。

? 函数调用都是很浪费系统时间的,因为有许多进栈出栈操作。因此有一种优化办法,就是把原来的函数调用,通过编译器的编译,改成非函数调用,把函数代码直接嵌到调用出,变成顺序执行。

? 面向对象的语言支持多态,静态编译无效确定程序调用哪个方法,因为多态是在程序运行中确定调用哪个方法。

参考:

http://www.cnblogs.com/zengkefu/p/5633342.html

版权声明

作者: ma_shoufeng(马瘦风)

出处: 博客园 马瘦风的博客

您的支持是对博主的极大鼓励, 感谢您的阅读.

本文版权归博主所有, 欢迎转载, 但未经博主同意必须保留此段声明, 且在文章页面明显位置给出原文链接, 否则博主保留追究法律责任的权利.

原文地址:https://www.cnblogs.com/shoufeng/p/9736148.html

时间: 2024-10-09 12:09:45

你应该知道的关于 HotSpot VM 的内容的相关文章

[转]HotSpot VM GC 的种类

原文地址:http://www.cnblogs.com/redcreen/archive/2011/05/04/2037029.html collector种类 GC在 HotSpot VM 5.0里有四种: incremental (sometimes called train) low pause collector已被废弃,不在介绍. 类别 serial collector parallel collector( throughput collector ) concurrent coll

HotSpot VM GC 的种类

collector种类 GC在 HotSpot VM 5.0里有四种: incremental (sometimes called train) low pause collector已被废弃,不在介绍. 类别 serial collector parallel collector( throughput collector ) concurrent collector(concurrent low pause collector) 介绍 单线程收集器使用单线程去完成所有的gc工作,没有线程间的

HotSpot VM运行时

HotSpot VM运行时系统为HotSpot JIT编译器和垃圾收集器提供服务和通用API,同时还为VM提供启动.线程管理.JNI(Java本地接口)等基本功能.HotSpot VM运行时环境担当许多职责,具体如下: 1.命令行选项 通过命令行选项来配置HotSpot VM,相当于HotSpot VM的配置文件,主要包括选择哪个JIT编译器.何种垃圾收集器.Java Heap的大小等.命令行选项主要有3类: 1.1.标准选项(Standard Option) 标准选项是Java Virtual

HotSpot VM GC收集器的合名问题

最近分析HotSpot VM GC日志,就各种收集器的名称搞晕掉了,幸好参考R大(RednaxelaFX )一些回复和文章.整理在此文,以方便自已日后查阅,也可让有需要的同学少走弯路,追本溯源,一切从DefNew的来因说起. DefNew: 是使用-XX:+UseSerialGC(新生代,老年代都使用串行回收收集器) ParNew: 是使用-XX:+UseParNewGC(新生代使用并行收集器,老年代使用串行回收收集器)或者-XX:+UseConcMarkSweepGC(新生代使用并行收集器,老

什么是HotSpot VM & 深入理解Java虚拟机

参考 http://book.2cto.com/201306/25434.html 另外,这篇文章也是从一个系列中得出的: <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)> http://book.2cto.com/201306/25426.html 已经下载了这本书(60多M..) /Users/baidu/Documents/Data/Interview/Java HotSpot 提起HotSpot VM,相信所有Java程序员都知道,它是Sun JDK和OpenJDK中所带

HotSpot VM GC 的种类(转)

collector种类 GC在 HotSpot VM 5.0里有四种: incremental (sometimes called train) low pause collector已被废弃,不在介绍. 类别 serial collector parallel collector( throughput collector ) concurrent collector(concurrent low pause collector) 介绍 单线程收集器使用单线程去完成所有的gc工作,没有线程间的

转:什么是即时编译(JIT)!?OpenJDK HotSpot VM剖析

重点 应用程序可以选择一个适当的即时编译器来进行接近机器级的性能优化. 分层编译由五层编译构成. 分层编译提供了极好的启动性能,并指导编译的下一层编译器提供高性能优化. 提供即时编译相关诊断信息的JVM开关. 像内联化和向量化之类的优化进一步增强了性能. OpenJDK HotSpot Java Virtual Machine被人亲切地称为Java虚拟机或JVM,由两个主要组件构成:执行引擎和运行时.JVM和Java API组成Java运行环境,也称为JRE. 在本文中,我们将探讨执行引擎,特别

Java HotSpot VM Options

可以结合 Java6——JVM参数选项  看看 Please note that this page only applies to JDK 7 and earlier releases. For JDK 8 please see the Windows, Solaris, Linux and Mac OS X reference pages. This document provides information on typical command-line options and envir

Unable to open socket file: target process not responding or HotSpot VM not loaded

The -F option can be used when the target process is not responding 在用jstack工具查看jvm线程的运行情况时出现上述错误.就是因为该进程长时间没有启停,在/tmp/hsperfdata_'username'/文件夹下的该进程文件被Linux自身的机制(tmp下面不能存放很多文件)删除,需重新启停.所以要注意/etc/cron.daily/tmpwatch改文件在生产的情况.否则出现内存泄漏,或者内存溢出时,很难排查,或者出