【JVM原理探索】带你梳理分析虚拟机栈映射源代码的流程

简介: 【JVM原理探索】带你梳理分析虚拟机栈映射源代码的流程

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内存模型)

image.png


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




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


  • JVM为每个线程创建一个虚拟机栈
  • 栈是私有,在线程间不会共享
  • 栈是一段连续的存储空间





堆用于存储创建好的对象


  • JVM只有一个堆
  • 堆被所有线程共享
  • 堆是不连续的空间,分配灵活




方法区


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


  • JVM只有一个方法区
  • 可共享
  • 存储不变的信息




运行过程


  • 程序均是将main方法作为程序的入口,执行第二条语句(第一条先忽略)
Person p2 = new Person();
复制代码
  1. 此时会在栈中开辟一个新的栈帧,为main方法栈帧;
  2. 方法区会加载整个类模板,存储类里面的相关信息;
  3. 在堆处会产生一个新的类的对象。

image.png


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


创建一个方法分4步:


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

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


image.png


下一条语句是

p2.name = "张三";
p2.age = 18;
复制代码


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


image.png


我们继续执行下条语句

p2.show();


image.png


  • 此时会执行show方法,我们注意到show方法中有age和name。那么它们是谁的name和age呢?我们可以看是p2.show()
  • p2的地址是0x11,指向的是堆中的0x11对象,所以show方法中的name和age就已知了
  • 那么当方法执行完后,show方法出栈,同时main方法也执行完毕,也需要出栈,main方法执行完后,对象和方法区中的类信息也就会清空。内存就会回到最初的状态


image.png






相关文章
|
1月前
|
监控 算法 Java
Java虚拟机(JVM)垃圾回收机制深度剖析与优化策略####
本文作为一篇技术性文章,深入探讨了Java虚拟机(JVM)中垃圾回收的工作原理,详细分析了标记-清除、复制算法、标记-压缩及分代收集等主流垃圾回收算法的特点和适用场景。通过实际案例,展示了不同GC(Garbage Collector)算法在应用中的表现差异,并针对大型应用提出了一系列优化策略,包括选择合适的GC算法、调整堆内存大小、并行与并发GC调优等,旨在帮助开发者更好地理解和优化Java应用的性能。 ####
46 0
|
18天前
|
Rust 安全 Java
JVM原理与实现——Synchronized关键字
在多线程Java程序中,`Synchronized`关键字用于确保线程安全。本文深入探讨其工作原理,通过分析字节码`monitorenter`和`monitorexit`,解释JVM如何实现同步机制。文章展示了`Synchronized`方法的编译结果,并详细解析了轻量锁和重度锁的实现过程,包括Mark Word的状态变化及CAS操作的应用。最后简要介绍了`ObjectMonitor::enter()`函数在获取重度锁时的作用。
JVM原理与实现——Synchronized关键字
|
1月前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
1月前
|
存储 监控 算法
Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####
|
2月前
|
机器学习/深度学习 监控 算法
Java虚拟机(JVM)的垃圾回收机制深度剖析####
本文深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法、性能调优策略及未来趋势。通过实例解析,为开发者提供优化Java应用性能的思路与方法。 ####
58 1
|
2月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
438 1
|
3月前
|
存储 安全 Java
jvm 锁的 膨胀过程?锁内存怎么变化的
【10月更文挑战第3天】在Java虚拟机(JVM)中,`synchronized`关键字用于实现同步,确保多个线程在访问共享资源时的一致性和线程安全。JVM对`synchronized`进行了优化,以适应不同的竞争场景,这种优化主要体现在锁的膨胀过程,即从偏向锁到轻量级锁,再到重量级锁的转变。下面我们将详细介绍这一过程以及锁在内存中的变化。
49 4
|
18天前
|
存储 Java 程序员
【JVM】——JVM运行机制、类加载机制、内存划分
JVM运行机制,堆栈,程序计数器,元数据区,JVM加载机制,双亲委派模型
|
2月前
|
Java
JVM内存参数
-Xmx[]:堆空间最大内存 -Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的 -Xmn[]:新生代的最大内存 -xx[use 垃圾回收器名称]:指定垃圾回收器 -xss:设置单个线程栈大小 一般设堆空间为最大可用物理地址的百分之80
|
2月前
|
Java
JVM运行时数据区(内存结构)
1)虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧 (2)本地方法栈:为native修饰的本地方法提供的空间,在HotSpot中与虚拟机合二为一 (3)程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码
27 3