java引用如果是成员变量则引用本身不保存在栈上的汇编级调试证明
很久很久没有更新博客了,因为发生太多太多猝不及防的事情,再加上自己本身也特别忙,这里补上一直想发的自己觉得很有意义的一次探索过程。
就是很多java开发人员都曾被误导的一个点——“如果一个变量是引用,则它会被存放在栈上”,其实这个证明早在2017.5月就完成了,时间有点久远,细节也许稍有遗忘。
这里先说下结论:一个变量是否会被存放在栈上,在于这个变量是不是写在一个方法里面,而不在于这个变量本身是否是个引用。
下面是示例代码:
public class Main {
public static void main(String[] args) {
Test test = new Test();
System.out.println("test->" + test);
System.out.println("t2->" + test.t2);
test.fn(1,2);
System.out.println("i->" + test.t2.test2_age);
}
}
public class Test {
int test_age = 5;
Test2 t2 = new Test2();
public int fn(int a, int b){
return a+b;
}
}
class Test2 {
int test2_age = 6;
}
调试工具参考R大写的一篇文章https://rednaxelafx.iteye.com/blog/1847971。我这边用文章中的命令打不开,所以写了个程序来间接打开,代码如下:
import sun.jvm.hotspot.HSDB;
public class OpenHSDB {
public static void main(String[] args) {
HSDB.main(args);
}
}
然后经常用到的HSDB命令如下:
查看堆:
universe 从堆中搜索对象:
scanoops 0x0f200000 0x15200000 Test2
结果
0x0f2d7c50 Test2
0x0f2d7c68 Test2
0x0f2d84e8 Test2 查看具体对象内容:
inspect 0x0f2d7c50 查找反向引用:
revptrs 0x0f2d7c50 查看在main线程中的TLAB中:
whatis 0x0f2d6d50
再利用jdb命令来单步调试最开始的java程序,具体的过程截图按顺序如下:



















具体的描述见每张截图上的描述,虚拟机字节码指令表地址。
完结。
java引用如果是成员变量则引用本身不保存在栈上的汇编级调试证明的更多相关文章
- 假如java类里的成员变量是自身的对象
假如java类里的成员变量是自身的对象,则新建该类对象时内存中怎么分配空间,我感觉似乎死循环了. 不过我想的肯定是错的,因为很多类的成员变量是自身对象,并且绝对无错,举个例子: Class A{ pr ...
- java类里的成员变量是自身的对象问题
今晚看单例模式饿汉时想到一个问题:假如java类里的成员变量是自身的对象,则新建该类对象时内存中怎么分配空间,我感觉似乎死循环了.于是上网搜索了下,哈哈,果然有人早就思考过这个问题了,站在巨人的肩膀上 ...
- JAVA中局部变量 和 成员变量有哪些区别
JAVA中局部变量 和 成员变量有哪些区别 1.定义的位置不一样<重点>***局部变量:在方法的内部成员变量:在方法的外部,直接写在类当中 2.作用范围不一样<重点>***局部 ...
- Java接口中的成员变量默认为(public、static、final)、方法为(public、abstract)
interface”(接口)可将其想象为一个“纯”抽象类.它允许创建者规定一个类的基本形式:方法名.自变量列表以及返回类型,但不实现方法主体.接口也可包含基本数据类型的数据成员,但它们都默认为publ ...
- C/C++ - 类中成员变量是引用
C++引用 引用在定义时必须初始化,否则编译时便会报错.如果类(自定义类型)的成员是引用类型,需要注意一些问题. 引用成员变量 并不为这个变量新辟空间:类对象做成员变量则是要对其新辟一段空间的 不能有 ...
- java继承关系中成员变量,构造方法,成员方法的关系
Java继承中的成员关系 A:成员变量 a:子类的成员变量名称和父类中的成员变量名称不一样,这个太简单写那个名字就访问那个名字! b:子类的成员变量名称和父类中的成员变量名称一样,这个怎么访问呢? 子 ...
- 测试 Java 类的非公有成员变量和方法
引言 对于软件开发人员来说,单元测试是一项必不可少的工作.它既可以验证程序的有效性,又可以在程序出现 BUG 的时候,帮助开发人员快速的定位问题所在.但是,在写单元测试的过程中,开发人员经常要访问类的 ...
- Java:全局变量(成员变量)与局部变量
分类细则: 变量按作用范围划分分为全局变量(成员变量)和局部变量 成员变量按调用方式划分分为实例属性与类属性 (有关实例属性与类属性的介绍见另一博文https://blog.csdn.net/Drag ...
- Java 的局部变量和成员变量
在Java语言中没有全局变量 分析各种变量的作用域的最简单方法是以花括号为界, 1.在类体中定义的是成员变量,成员变量会被默认初始化 2.在方法中定义的是局部变量,局部变量不会被默认初始化
随机推荐
- selenium 操作多个窗口间切换
#coding=gbk ''' selenium多个窗口间切换 ''' from selenium import webdriver as wd from selenium.webdriver imp ...
- xss之上传文件的xss,绕过csp,预警机制
xss1.XSS姿势——文件上传XSS https://wooyun.x10sec.org/static/drops/tips-14915.html总结: 1.1.文件名方式,原理:有些文件名可能反应 ...
- Python进阶:都说好用的 Python 命令行库click
click 是一个以尽可能少的代码.以组合的方式创建优美的命令行程序的 Python 包.它有很高的可配置性,同时也能开箱即用. 它旨在让编写命令行工具的过程既快速又有趣,还能防止由于无法实现预期的 ...
- Codeforces Round #591 (Div. 2, based on Technocup 2020 Elimination Round 1) C. Save the Nature【枚举二分答案】
https://codeforces.com/contest/1241/problem/C You are an environmental activist at heart but the rea ...
- PHP mysqli_connect_error() 函数
返回上一次连接错误的错误描述: <?php $con=mysqli_connect("localhost","wrong_user","my_p ...
- 002_C/C++笔试题_简单算法程序
(一)冒泡排序法 #include <iostream> using namespace std; void bubblesort(int a[], int m); int main(vo ...
- 003_STM32程序移植之_W25Q64
1. 测试环境:STM32C8T6 2. 测试模块:W25Q64FLASH模块 3. 测试接口: 1. W25Q64FLASH模块接口: VCC3.3--------------------VCC3. ...
- 字节(byte)、二进制、字节流、字符流相关概念分析
https://blog.csdn.net/changwilling/article/details/52065955 1.字节: 字(Byte)节是长度单位.位(bit)也是长度单位. 因为计算机通 ...
- STS工具:mybayis连接oracle数据库
1.pom.xml文件中的依赖 刚添加依赖的时候会报错,原因是jar包下不下来. 2.我的jdk是1.6,所以需要升级jdk版本到1.8 执行mvn -v命令,可以看到maven的版本号 DOS窗口执 ...
- 【线性代数】6-5:正定矩阵(Positive Definite Matrices)
title: [线性代数]6-5:正定矩阵(Positive Definite Matrices) categories: Mathematic Linear Algebra keywords: Po ...