首页 > 其他分享 >JVM

JVM

时间:2022-11-28 11:35:14浏览次数:38  
标签:详述 java 虚拟机 JVM Java 方法

本篇仅仅是JVM的简介,关于更多的JVM细节,请参见

参见:  ​​ 关于类加载子系统详述​​

参见:   ​​关于程序计数器详述​​

参见   ​​关于Java虚拟机栈的详述​​

参见:  ​​关于本地方法接口详述​​

参见:  ​​关于本地方法栈详述​​

参见:  ​​ 关于方法区的详述​​

参见:   ​​关于堆区的详述​​

参见:  ​​关于执行引擎的详述​​

计算机系统当中的JVM

  •  JVM是运行在操作系统之上的,并没有和硬件有直接的交互
  • Java代码一次编译,到处运行

JVM_java

HotSpot虚拟机结构概览


JVM_java_02

  • 方法区和堆区是所有线程共享的内存区域;
  • 而java栈、本地方法栈和程序计数器是运行是线程私有的内存区域。
  • Java栈又叫做jvm虚拟机栈。
  • 方法区(永久代)在jdk8中又叫做元空间Metaspace
  • 方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器(JIT编译器,英文写作Just-In-Time Compiler)编译后的代码等数据。
  • 虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做 Non-Heap(非堆),目的应该是与 Java 堆区分开来。
  • java代码大致执行流程:java源程序--编译javac-->字节码文件.class-->类装载子系统生成反射类(存入方法区)--->运行时数据区(五大块儿)--->执行引擎-->解释执行+编译执行(JIT)-->操作系统(Win,Linux,Mac JVM)

栈的指令集架构和寄存器的指令集架构

​由于跨平台的设计,java的指令都是根据栈来设计的,不同平台CPU架构不同,所以不能设计为基于寄存器的​

二者区别:

栈:跨平台性、指令集小、指令多;执行性比寄存器差
寄存器:指令少

一些简单查看命令:

//查看指令集命令代码
cd out/production/类根目录

//反编译
javap -v StackStruTest.class

//打印程序执行的进程
jps

Hotspot中方法区的变动:

关于方法区的结构,在过去的版本jdk1.6/1.7/1.8当中均有变动,故在此提前声明:

  • jdk1.6及之前:有永久代(permanent generation) ,静态变量、字符串常量池存放在 永久代上。
  • jdk1.7:有永久代,但已经逐步“去永久代”,字符串常量池、静态变量移除,保存在堆中。注意:
  • jdk1.8及之后: 无永久代,类型信息、字段、方法、常量保存在本地内存的元空间,但字符串常量池、静态变量仍留在堆空间.

JVM_方法区_03

JVM_java虚拟机_04

注意:

jdk1.8及之后: 无永久代,类型信息、字段、方法、常量保存在本地内存的元空间。

但字符串常量池、静态变量仍留在堆空间。

除此之外,元空间(或称方法区),不再使用虚拟机内存,而是使用本地内存。

JVM_java_05

jvm生命周期

1.启动

通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的.

2.执行

  • 一个运行中的java虚拟机有着一个清晰的任务:执行Java程序;
  • 程序开始执行的时候他才运行,程序结束时他就停止;
  • 执行一个所谓的Java程序的时候,真真正正在执行的是一个叫做Java虚拟机的进程。

3.退出

  • 程序正常执行结束
  • 程序异常或错误而异常终止
  • 操作系统错误导致终止
  • 某线程调用Runtime类或System类的exit方法,或Runtime类的halt方法,并且java安全管理器也允许这次exit或halt操作
  • 除此之外,JNI规范描述了用JNI Invocation API来加载或卸载Java虚拟机时,Java虚拟机的退出情况

补充:古今JVM

  • SUN Classic
  • Exact VM
  • HotSpot VM :HotSpot指热点代码探测技术
  • BEA JRockit:(BEA 已被Oracle收购) 专注于服务端应用,世界最快的jvm之一
  • IBM J9
  • Taobao JVM: 目前已经在淘宝、天猫上线,替换了Oracle官方JVM;
  • Graal VM: Oracle 2018年4月公开,口号 Run Programs Faster Anywhere.最可能替代HotSpot的产品

Android虚拟机 DVM

  • 谷歌开发,基于Android,在2.2中提供了JIT
  • 只能称作虚拟机 不能称为java虚拟机,他没有遵循Java虚拟机规范
  • 基于寄存器架构,效率高,但是跟硬件耦合度比较高
  • 不能直接执行class文件,执行的是dex文件
  • 5.0使用支持提前编译的ART VM替换Dalvik VM

标签:详述,java,虚拟机,JVM,Java,方法
From: https://blog.51cto.com/u_15334563/5890773

相关文章

  • JVM 指令02__算术指令
    一、概述1.1、作用算术指令用于对操作数栈栈顶的元素(如果运算只包含一个操作数,那么该元素就是栈顶的元素,如果有两个操作数,那么就是栈顶和次栈顶的元素)进行某种特定......
  • 【高级篇】Java JVM实战 之 内存调优
    文章目录​​一、通过Jprofiler调式Dump文件错误​​​​⛅什么是Jprofiler?​​​​⚡使用Jprofiler调试Dump文件​​​​二、堆内存调优​​​​三、GC垃圾回收器​​​......
  • JVM 指令01__加载指令
    一、概述每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧用于存放局部变量表、操作数栈、动态链接、方法出口等信息,在栈帧中与Jvm指令关系最密切的就是局部变量......
  • JVM复习【面试】
    JVM复习【面试】​​前言​​​​推荐​​​​复习【JVM】​​​​第一部分走进Java​​​​第1章走进Java/2​​​​第二部分自动内存管理机制​​​​第2章Java内存......
  • 【Linux】linux | top | java | jvm | 分析cpu占用过高 | 分析jvm堆栈信息
    一、说明        1、正式环境,cpu飙升,需要排查想原因        2、正式环境:CentOS8+jdk8+nginx+java服务二、过程1、查看cpu占用1)命令topc说明1:从高......
  • JVM(一)--JVM介绍和Class File
    什么是JVM流程图(代表一次编译到处运行)Java虚拟机与物理机对比Class文件类比输入设备CPU指令集类比输出设备JVM类比存储器、控制器、运算器等JVMproducts最常......
  • TMD,JVM类加载原来是这样的!!!!
    接上篇:通过字节码,我们了解了class文件的结构通过运行数据区,我们了解了jvm内部的内存划分及结构接下来,让我们看看,字节码怎么进入jvm的内存空间,各自进入那个空间,以及怎么......
  • 重新认识下JVM级别的本地缓存框架Guava Cache(2)——深入解读其容量限制与数据淘汰策
    大家好,又见面了。本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面。如果感兴趣,欢迎关注以获取后续更新。通......
  • java后端JVM面试资料
    目录 JDK,JRE,JVM三者的区别与联系讲⼀讲JVM跨平台与跨语⾔JVM的运⾏时数据区有哪些?什么是堆内存?堆内存包含哪些部分?什么是内存溢出什么是内存泄漏?与内存溢出有什......
  • JVM秋招总结
    JVM是Java相关知识中重要的一大块,这里记录一下自己的学习思路,以及印象比较深刻的知识点和面试问题个人总结思路思路顺着一次Java程序运行中,涉及到的JVM部分总结首先为......