JVM之对象创建以及调用main方法调用其他方法详解

简介: JVM之对象创建以及调用main方法调用其他方法详解

三、方法中new对象同时调用另外一个方法的JVM指令详解

package com.zhou.jvm.runtimedataAreainstructionset;
/**
 * @author zhouyanxiang
 * @create 2020-08-2020/8/6-8:43
 */
public class TestMethod {
    public static void main(String[] args) {
        TestMethod t = new TestMethod();
        t.m();
    }
    public void m() {
        int i = 200;
    }
}

这个是main方法的Bytecode

0 new #2 <com/zhou/jvm/runtimedataAreainstructionset/TestMethod>
 3 dup
 4 invokespecial #3 <com/zhou/jvm/runtimedataAreainstructionset/TestMethod.<init>>
 7 astore_1
 8 aload_1
 9 invokevirtual #4 <com/zhou/jvm/runtimedataAreainstructionset/TestMethod.m>
12 return

这个是m方法的Bytecode

0 sipush 200
3 istore_1
4 return

3.1 new

会在堆内存开辟一个对象的空间,并将对象的赋值为默认值,同时会将对象的地址值压入操作数栈

3.2 dup

dup指令全称应该是duplicate复制的意思,将操作数栈中存的对象的地址值复制一份

3.3 invokespecial

invokespecial指令就是调用初始化方法,把堆内存的对象赋值为初始值,同时将上一步复制的地址值要弹出去,为了告诉哪个对象再执行所以需要弹栈拿出去进行计算。

弹栈处理完后的结果图如下

3.4 astore_1

将地址值弹栈压入局部变量表赋值给索引为1的变量

3.5 aload_1

把局部变量表中索引为1的变量的值压入操作数栈当中

3.6 invokevirtual

invokevirtual把操作数栈的值弹栈,去另外一个操作数栈中得到值

3.7 m方法的JVM指令

0 sipush 200
3 istore_1
4 return

sipush 200是将200压入操作数栈当中

istore_1就是将200弹栈到局部变量表当中

return返回

3.8 m的return之后回到了main方法的invokevirtual指令结束


相关文章
|
1月前
|
存储 算法 Java
散列表的数据结构以及对象在JVM堆中的存储过程
本文介绍了散列表的基本概念及其在JVM中的应用,详细讲解了散列表的结构、对象存储过程、Hashtable的扩容机制及与HashMap的区别。通过实例和图解,帮助读者理解散列表的工作原理和优化策略。
40 1
散列表的数据结构以及对象在JVM堆中的存储过程
|
11天前
|
存储 Java 开发者
浅析JVM方法解析、创建和链接
上一篇文章《你知道Java类是如何被加载的吗?》分析了HotSpot是如何加载Java类的,本文再来分析下Hotspot又是如何解析、创建和链接类方法的。
|
21小时前
|
缓存 Java
JVM对象引用
本次课程聚焦JVM对象引用,涵盖强引用、软引用、弱引用和虚引用。强引用是最常见的引用类型,确保对象不会被垃圾回收器回收,适用于需要确保对象存活的场景;软引用在内存不足时会被优先回收,常用于缓存;弱引用的对象随时可能被回收,适合临时对象;虚引用最弱,主要用于接收对象回收通知,进行资源清理。通过合理选择引用类型,可优化内存管理,避免内存泄露。
|
2月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
81 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
29天前
|
监控 Java Spring
JVM如何监控某个方法的入参和相应结果?
JVM如何监控某个方法的入参和相应结果?
34 0
|
2月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
60 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
2月前
|
算法 Java
JVM进阶调优系列(3)堆内存的对象什么时候被回收?
堆对象的生命周期是咋样的?什么时候被回收,回收前又如何流转?具体又是被如何回收?今天重点讲对象GC,看完这篇就全都明白了。
|
4月前
|
存储 Java 程序员
Java中对象几种类型的内存分配(JVM对象储存机制)
Java中对象几种类型的内存分配(JVM对象储存机制)
96 5
Java中对象几种类型的内存分配(JVM对象储存机制)
|
4月前
|
缓存 监控 算法
吃透 JVM 诊断方法与工具使用
【8月更文挑战第4天】深入了解并掌握JVM诊断需把握几大要点:1) 熟悉JVM内存模型,如堆、栈及方法区;2) 掌握垃圾回收机制与算法;3) 运用工具如`jps`(查看Java进程)、`jstat`(监控运行状态)、`jmap`(生成堆快照)、`jhat`(分析堆快照)、`jstack`(检查线程栈); 4) 利用专业工具如Eclipse Memory Analyzer分析堆转储文件查找内存泄漏; 5) 动态监控与调整JVM参数; 6) 结合日志分析性能瓶颈。通过实战案例加深理解,有效应对JVM性能问题。
|
4月前
|
监控 Java Android开发
吃透 JVM 诊断方法与工具使用
【8月更文挑战第3天】要精通JVM诊断,需掌握关键监控指标如内存(堆/非堆)、CPU使用及线程状态;熟悉工具如`jstat`(监控状态)、`jmap`(堆转储)、`jstack`(线程堆栈);并能利用Eclipse Memory Analyzer (MAT)分析堆转储找内存泄漏;同时理解GC日志以优化垃圾回收行为;通过实践案例加深理解。