jvm技术专题带你梳理分析虚拟机栈映射源代码的流程「原理篇」(代码片段)

浩宇の天尚 浩宇の天尚     2022-12-06     815

关键词:

Java执行过程介绍

类是面向对象编程中最基本的单位。

Java中的类包含三个内容,分别是:

属性

  • 属性又叫成员变量。

  • 属性用于定义类或类对象的数据(静态特征)

  • 范围为整个类体

方法

  • 方法用于定义类或类对象的行为特征(执行动作)(动态)

  • 方法类似于面向过程中的函数,面向过程中的函数是最基本的单位;

  • 面向对象中,最基本单位是类,方法从属于类和对象。

构造方法

  • 构造方法分为无参构造方法;有参构造方法。

  • 构造方法要与类名保持一致。

  • 如果不设置构造方法,则系统自动生成无参构造方法。

属性的定义格式:

//若不初始化则系统默认给默认值
[修饰符] 属性类型 属性名 = [默认值];

方法定义格式:

[修饰符] 方法返回值类型 方法名(形参)
 语句

有如下代码进行示例分析

public class Person
	public String name;   //属性,带有修饰符
	int age;
	public void show()  //方法
		System.out.println("姓名:"+name+",年龄:"+age);
	
	/*
	Person() 
	 //构造方法,手动,无参构造方法,一个类里无参构造方法只能有	一个
	
	*/
	/*
	//手动,有参构造方法。
	Person(String name, int age)
		this.name = name;
		this.age = age;
	
	*/
	public static void main (String[] args)
		//此时调用的是上面手动有参的构造方法
		Person p1 = new Person("李四",18);
		//此时调用的是无参构造方法
		Person p2 = new Person();
		//无参构造方法需要以下赋值
		p2.name = "张三";
		p2.age = 18;
		p2.show();
	

内存分析

上面介绍了类的基本知识,那么我们接下来根据上面的代码来进行内存分析。

JVM内存模型很复杂,为了更好的理解面向对象和面向对象代码,下面进行对模型的简化。(此内存分析并不是为了理解JVM内存模型)

下面对上面三个内存模型进行特征介绍:

栈描述的是方法执行的内存模型,每个方法被调用时都会创建一个栈帧

  • JVM为每个线程创建一个虚拟机栈

  • 栈是私有,在线程间不会共享

  • 栈是一段连续的存储空间

堆用于存储创建好的对象

  • JVM只有一个堆

  • 堆被所有线程共享

  • 堆是不连续的空间,分配灵活

方法区

方法区实际也是堆,用来专门存储类、常量(static关键词相关)等相关信息

  • JVM只有一个方法区

  • 可共享

  • 存储不变的信息

运行过程

  • 程序均是将main方法作为程序的入口,执行第二条语句(第一条先忽略)
Person p2 = new Person();
  1. 此时会在栈中开辟一个新的栈帧,为main方法栈帧;

  2. 方法区会加载整个类模板,存储类里面的相关信息;

  3. 在堆处会产生一个新的类的对象。

Java使用new关键字来调用构造方法,从而返回该类的实例(对象)。但是这个对象不是完全由构造方法来创建的

创建一个方法分4步:

在堆中分配对象空间,并将对象的成员变量初始化默认值执行显式初始化(比如int i = 3)执行构造方法返回对象地址

当Person()构造方法调用完成后,出栈继续执行main中的下一条语句。如图

下一条语句是

p2.name = "张三";
p2.age = 18;

此时是方法区的张三赋值给name;

我们继续执行下条语句

p2.show();

  • 此时会执行show方法,我们注意到show方法中有age和name。那么它们是谁的name和age呢?我们可以看是p2.show()

  • p2的地址是0x11,指向的是堆中的0x11对象,所以show方法中的name和age就已知了

  • 那么当方法执行完后,show方法出栈,同时main方法也执行完毕,也需要出栈,main方法执行完后,对象和方法区中的类信息也就会清空。内存就会回到最初的状态

jvm专题-虚拟机栈(代码片段)

文章目录1.定义2.演示3.问题辨析3.1.垃圾回收是否涉及栈内存?3.2.栈内存的分配越大越好吗?3.3.方法内的局部变量是否是线程安全的?3.4.栈内存溢出3.5.线程诊断_CPU占用过高3.6.线程诊断_迟迟得不到结果1.定义JavaVirtual... 查看详情

jvm技术专题字节码指令集调用执行流程分析「语法分析篇」(代码片段)

文章介绍这篇文章讲解了在Java虚拟机上Java代码是如何编译成字节码并执行的。理解在Java虚拟机中Java代码如何别被编译成字节码并执行是非常重要的,因为这可以帮助你理解你的程序在运行时发生了什么。这种理解不仅能确... 查看详情

jvm技术专题深入分析内存布局及gc原理分析「下卷」(代码片段)

...中卷的针对于GC虚拟机相关的文章了,详细可见【JVM技术专题】深入分析内存布局及GC原理分析「上卷」)和【JVM技术专题】深入分析内存布局及GC原理分析「中卷」,目前我相信已经会有相关的对GC的原理和虚拟机的... 查看详情

jvm技术专题虚拟机字节码执行引擎方法调用「分析篇」(代码片段)

方法调用方法调用并不等同于方法中的代码被执行,而是确定被调用方法的版本(哪一个方法要被执行),而并不涉及到方法内部的具体执行过程。由于java中,方法调用在class文件中存储的都是符号引用,... 查看详情

jvm技术专题全流程化分析java对象的创建过程「原理篇」(代码片段)

前言概要对应过程则是:对象创建、对象内存布局、对象访问定位的三个过程。对象的创建过程对象的创建方式java中对象的创建方式有很多种,常见的是通过new关键字和反射这两种方式来创建。除此之外,还有clone、... 查看详情

jvm技术专题针对于hotspot虚拟机对象学习和分析指南「入门篇」(代码片段)

对象的创建语言层面上,创建对象通常(例外:克隆、反序列化)仅仅是一个new关键字而已,而在虚拟机中,对象(本文中讨论的对象限于普通Java对象,不包括数组和Class对象等)的创建又是怎... 查看详情

jvm技术专题深入分析内存布局及gc原理分析「中卷」(代码片段)

...没有看到上篇直接进入下篇,希望可以先看一下【JVM技术专题】深入分析内存布局及GC原理分析「上卷」),接下来我们会侧重点去讲解GC回收机制的运作流程以及回收期(暂时不包含最新的ZGC),小 查看详情

jvm技术专题深入分析内存布局及gc原理分析「上卷」(代码片段)

前提概要JVM虚拟机的整体的结构分布图,我个人觉得比较难掌握和理解的问题主要集中在“GC回收(内存管理)”和“内存布局”,这两部分属于真正的核心部分,至于执行引擎,可以理解为X86的寄存器执行方式或者... 查看详情

jvm技术专题「原理专题」全流程分析java对象的创建过程及内存布局(代码片段)

前言概要对应过程则是:对象创建、对象内存布局、对象访问定位的三个过程。对象的创建过程对象的创建方式java中对象的创建方式有很多种,常见的是通过new关键字和反射这两种方式来创建。除此之外,还有clone、... 查看详情

jvm技术专题深入分析回顾堆外内存使用和分析「分析篇」(代码片段)

堆外内存堆外内存,其实就是不受JVM控制的内存。简单来说,除了堆栈内存,剩下的就都是堆外内存了(当然,这是从Java运行时内存的角度来看),堆外内存直接受操作系统管理,而不是虚拟机。... 查看详情

jvm梳理

堆内存:在JVM开启的时候就会被创建存放对象实例,几乎所有的对象实例都在这里分配内存存放由new创建的对象和数组,即动态申请的内存都存放在堆内存栈内存:栈内存是用来存放在函数中定义的一些基本类型的变量和对象的... 查看详情

深入浅出spring原理及实战「原理分析专题」不看源码就带你剖析ioc容器核心流程以及运作原理

...的源码就带你浏览Spring的核心流程以及运作原理学好Spring技术的背景针对于每一个Java的爱好者而言,无论是从事面向于微服务架构技术的领域(SpringCloud、SpringCloud-Alibaba等),还是面向于传统互联网行业(Spri... 查看详情

jvm技术专题jvm分析与调优技巧分析「原理篇」(代码片段)

JVM空间说明在JDK1.7及以前,HotSpot虚拟机将java类信息、常量池、静态变量、即时编译器编译后的代码等数据,存储在Perm(永久带)里(对于其他虚拟机如BEAJRockit、IBMJ9等是不存在永久带概念的),类的... 查看详情

jvm技术专题重塑你对类加载机制的认识「分析篇」(代码片段)

📕每日一句极限就是为了超越而存在的,如何挑战自己的极限,只能苦练!📕为什么又要写类加载器?为什么有些一篇相关与对类加载器的文章?个人觉得之前的侧重点在于ClassLoader本身,以及双... 查看详情

springboot技术专题「开发实战系列」全面梳理和分析一下相关的web核心配置(代码片段)

SpringBoot提供的自动配置分析WebMvcAutoConfiguration及WebMvcProperties的源码,发现SpringBoot为我们提供了如下自动配置功能。自动配置ViewResolver。(1)ContentNegotiatingViewResolver:这是一个特殊的ViewResolver,ContentNego 查看详情

jvm运行时数据区篇(虚拟机栈)(代码片段)

JVM运行时数据区篇1.什么是虚拟机栈?2.虚拟机栈的作用特点3.虚拟机栈的常见异常4.虚拟机栈的存储结构5.虚拟机栈的运行原理6.虚拟机栈的栈帧结构1.什么是虚拟机栈?内存中的堆和栈栈是运行时的单位,而堆是存储... 查看详情

jvm技术专题精心准备了一套jvm分析工具的锦囊「上篇」(代码片段)

前提概要本文主要了解以下内容:JDK自带的几款在线监控工具(JPS、jstat、jstack、jmap),用户实时监控JVM运行装填。【官方文档】JVM离线分析工具(VisualVM),用于分析dump下来的堆内存文件,远程监控JVM状态... 查看详情

day326&327.虚拟机栈-jvm(代码片段)

虚拟机栈一、虚拟机概述1、虚拟机栈出现的背景2、内存中的栈与堆堆占用内存中比较大的区域堆管存储栈管运行3、类比图4、虚拟机栈基本内容Java虚拟机栈的存储基本单位是:栈帧一个栈帧对应一个Java方法栈帧是每一个线... 查看详情