JVM

HotSpot虚拟机在JVM中运行,不直接与硬件交互。方法区和堆区为共享内存,Java栈、本地方法栈和程序计数器为线程私有。在JDK8中,永久代被元空间取代,存储类信息、静态变量等。元空间使用本地内存而非虚拟机内存。JIT编译器优化代码执行,字符串常量池和静态变量在JDK1.8后仍存于堆中。
摘要由CSDN通过智能技术生成

HotSpot虚拟机结构概览

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

方法区和堆区是所有线程共享的内存区域;

  • 而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架构不同,所以不能设计为基于寄存器的;栈:跨平台性、指令集小、指令多;执行性比寄存器差 ;寄存器:指令少

相关命令如下:

Hotspot中方法区的变动:

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

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

请注意:

  • jdk1.8及之后: 无永久代,类型信息、字段、方法、常量保存在本地内存的元空间。
  • 但字符串常量池、静态变量仍留在堆空间。
  • 除此之外,元空间(或称方法区),不再使用虚拟机内存,而是使用本地内存。

补充:历来主流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的产品
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值