首页 > 编程语言 >Java虚拟机运行时数据区(JVM_2)

Java虚拟机运行时数据区(JVM_2)

时间:2023-04-06 15:01:40浏览次数:57  
标签:Java 虚拟机 线程 内存 JVM 2.3 方法

2.3 运行时数据区(Run-TIme Data Areas)

2.3.1 官网概括

官网; https://docs.oracle.com/javase/specs/jvms/se8/html/index.html

The Java Virtual Machine defines various run-time data areas that are used during 
execution of a program. Some of these data areas are created on Java Virtual 
Machine start-up and are destroyed only when the Java Virtual Machine exits. 
Other data areas are per thread. Per-thread data areas are created when a thread 
is created and destroyed when the thread exits.

2.3.2 图解

Java虚拟机运行时数据区(JVM_2)_方法区

2.3.3 初步介绍

2.3.3.1 Method Area(方法区)

Java虚拟机运行时数据区(JVM_2)_方法区_02

1.  Java虚拟机有一个在所有Java虚拟机线程之间共享的方法区域。

2.  方法区域是在虚拟机启动时创建的。

3.  方法区域在逻辑上是堆的一部分,但是它有一个别名Non-Heap(非堆),目的是和heap(堆)分开

4.  方法区域的内存不需要是连续的。

5.  如果方法区域中的内存不能用于满足分配请求,Java虚拟机将抛出OutOfMemoryError。

另外不同JDK版本Method Area真正的实现不同;

JDK 8中 是Metaspace(元空间)

JDK 8之前是Perm Space(永久代)

二者主要区别:

Meta space和Perm space的主要区别在于存储元数据的方式和管理方式。Meta space使用本地内存存储元数据,并具有自动内存管理功能,而Perm space则位于JVM的堆内存中,并且容量是固定的。

2.3.3.2 Heap(堆)

Java虚拟机运行时数据区(JVM_2)_Java_03

1.  Java堆是Java虚拟机所管理内存中最大的一块,在虚拟机启动时创建,被所有线程共享。

2.  Java对象实例以及数组都在堆上分配。

2.3.3.3 Java Virtual Machine Stacks(虚拟机栈)

Java虚拟机运行时数据区(JVM_2)_操作数_04

1.  虚拟机栈是一个线程执行的区域,保存着一个线程中方法的调用状态。换句话说,一个Java线程的 运行状态,由一个虚拟机栈来保存,所以虚拟机栈肯定是线程私有的,独有的,随着线程的创建而创 建。

2.  每一个被线程执行的方法,为该栈中的栈帧,即每个方法对应一个栈帧。调用一个方法,就会向栈中压入一个栈帧;一个方法调用完成,就会把该栈帧从栈中弹出。

void method_a(){
method_b();
}
void method_b(){
method_c();
}
void method_C(){
}

Java虚拟机运行时数据区(JVM_2)_方法区_05

栈帧:

官网https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.6

每个栈帧对应一个被调用的方法,可以理解为一个方法的运行空间。 每个栈帧中包括局部变量表(Local Variables)、操作数栈(Operand Stack)、指向运行时常量池的引用(A reference to the run-time constant pool)、方法返回地址(Return Address)和附加信息。

Java虚拟机运行时数据区(JVM_2)_操作数_06

局部变量表: 方法中定义的局部变量以及方法的参数存放在这张表中 局部变量表中的变量不可直接使用,如需要使用的话,必须通过相关指令将其加载至操作数栈中作为操作数使 用。

操作数栈:以压栈和出栈的方式存储操作数的

动态链接:每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用 过程中的动态连接(Dynamic Linking)。

方法返回地址:当一个方法开始执行后,只有两种方式可以退出,一种是遇到方法返回的字节码指令;一种是遇 见异常,并且这个异常没有在方法体内得到处理。

2.3.3.4 The pc Register(程序计数器)

Java虚拟机运行时数据区(JVM_2)_Java_07

如果线程正在执行Java方法,则计数器记录的是正在执行的虚拟机字节码指令的地址; 如果正在执行的是Native方法,则这个计数器为空。

2.3.3.5 Native Method Stacks(本地方法栈)

Java虚拟机运行时数据区(JVM_2)_操作数_08

如果当前线程执行的方法是Native类型的,这些方法就会在本地方法栈中执行。

那如果在Java方法执行的时候调用native的方法呢?

Java虚拟机运行时数据区(JVM_2)_Java_09

2.3.4 各种情况

2.3.4.1 栈指向堆

在栈帧中有一个变量,类型为引用类型,比如Object obj=new Object(),这时候就是典型的栈中元 素指向堆中的对象。

Java虚拟机运行时数据区(JVM_2)_Java_10

2.3.4.2 方法区指向堆

方法区中会存放静态变量,常量等数据。如果是下面这种情况,就是典型的方法区中元素指向堆中的对 象。

private static Object obj=new Object();

Java虚拟机运行时数据区(JVM_2)_Java_11

2.3.4.3 堆指向方法区

方法区中会包含类的信息,堆中会有对象,那怎么知道对象是哪个类创建的呢?

Java虚拟机运行时数据区(JVM_2)_方法区_12

那么一个对象具体是怎么知道它是由那个类创建出来的呢?这就涉及到对象的内存模型了。

2.3.4.4 Java对象内存模型

Java虚拟机运行时数据区(JVM_2)_操作数_13

标签:Java,虚拟机,线程,内存,JVM,2.3,方法
From: https://blog.51cto.com/u_15996162/6173239

相关文章

  • 走进Java接口测试之测试报告ExtentReport
    引言在走进Java接口测试之测试框架TestNG 中我们详细介绍了TestNG的各种用法,在本文中,我将详细介绍如何将ExtentReports测试报告与TestNG集成。ExtentReports简介主要特点:生成的报告简洁美观生成的单html方便Jenkins集成发邮件自带集中展示历史报告的服务端支持Java和.N......
  • 走进Java接口测试之流行框架SpringBoot(概念篇)
    引言说起SpringBoot不得不先了解一下Spring这个企业,不仅因为SpringBoot来源于Spring大家族,而是SpringBoot的诞生和Sping框架的发展息息相关。Spring历史2002年正是JavaEE和EJB大行其道的时候,很多知名公司都是采用此技术方案进行项目开发。一个美国的小伙子Ro......
  • VM安装虚拟机时各分区,设备类型,文件系统简介
    各分区简介:/boot:存放开机文件,一般为100M左右(50M~200M)。swap:swap是交换分区、可以看成一种虚拟的内存扩展,内存不够是,可以将内存程序移入,需要时再取出,会比从硬盘读取快。/:linux根目录的分区。各设备类型简介:标准分区:标准分区可以包含文件系统或交换空间,也能提供一个容器,用于......
  • JAVA - 基础篇
    时隔这么久,之前学习JAVA一直没有坚持下来,这次一定要坚持啊。是跟着B站尚硅谷的老师学习的!资料非常齐全,讲得也很认真仔细。这里会记录一些简单的归纳,很全很全的在老师的资料里就有!关注公众号就能领取,尚硅谷教育。前言学习一门计算机语言真的是一件很奇妙的事情,单靠简单的......
  • Java方法
    类,对象,方法 定义方法要加static才能正常引用,详见https://www.bilibili.com/video/BV12J41137hu?p=45&vd_source=7b7ae7eed522b23c0252ec372088c729   Java都是值传递.方法的重载:方法的名字可以相同,参数不相同即可.  可变参数:不定项       ......
  • 走进Java接口测试之读取配置文件
    前言但在大部分用例开发环境下,添加额外配置是无所避免的,比如自定义应用端口号、服务地址、数据库的配置等,都或多或少的需要一些外部的配置项等。在前文中我们有详细介绍在接口测试框架中如何基于SpringBoot快速搭建多环境配置,本文将在原有的基础上介绍集成如何快速读取配置文件的......
  • 性能监控之常见 Java Heap Dump 方法
    一、前言在本文中,我们总结下抓Javadump的几种不同方法。JavaHeapDump是特定时刻JVM内存中所有对象的快照。它们对于解决内存泄漏问题和分析Java应用程序中的内存使用情况非常有用。JavaHeapDump通常以二进制格式的hprof文件存储。我们可以使用jhat或JVisualVM之......
  • 1- Java概述
    1.人机交互1.1什么是cmd?就是在windows操作系统中,利用命令行的方式去操作计算机。我们可以利用cmd命令去操作计算机,比如:打开文件,打开文件夹,创建文件夹等。1.2如何打开CMD窗口?按下快捷键:win+R。此时会出现运行窗口。在运行窗口中输出cmd输出回车。解......
  • 2-Java基础语法
    1.注释注释是对代码的解释和说明文字。Java中的注释分为三种:单行注释://这是单行注释文字多行注释:/_这是多行注释文字这是多行注释文字这是多行注释文字_/注意:多行注释不能嵌套使用。文档注释(暂时用不到):/*_这是多行注释文字这是多行注释文字这是多......
  • java面试题学习记录2
    1.索引的分类 主键索引,联合索引,唯一索引,全文索引,普通索引2.锁的分类 行锁:操作数据库时,锁定整行数据 表锁:操作数据库时,锁定整表数据 乐观锁:多线程情况下,认为其他线程不会去修改的数据,所以不会上锁,但是会在跟新时,判断一下数据有没有被改变,可以用版本号机制 悲......