• 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程序,具体的过程截图按顺序如下:

    具体的描述见每张截图上的描述,虚拟机字节码指令表地址

    完结。

  • 相关阅读:
    JVisualVM远程监控
    周记 2014.11.22
    读取配置文件
    周记 2014.11.15
    MyBatis 逆向工程介绍
    PyTorch模型加载与保存的最佳实践
    ubuntu 服务器 php 环境简单搭建
    【重温广州读书会三青年自白,想念在深圳建会工人斗争中积极声援的他们!!】
    EventBus 3.0 的基本使用
    搭建Hexo博客
  • 原文地址:https://www.cnblogs.com/joey-hua/p/11363006.html
Copyright © 2020-2023  润新知