• JVM学习01:内存结构


    JVM学习01:内存结构

    写在前面:本系列分享主要参考资料是  周志明老师的《深入理解Java虚拟机》第二版。

    内存结构知识要点Xmind梳理

    案例分析

    分析1

    package com.hs.jvm;
    
    public class JVMTest1 {
    
        public static void main(String[] args){
    
            /**
             * intger1 和 intger2都是Integer的引用,线程运行时位于虚拟机栈中新建的栈帧中
             * 该引用持有指向堆中的Integer实例的引用,而两实例在堆中的地址是不同的
            */
    
            Integer intger1 = new Integer(1);
            Integer intger2 = new Integer(1);
    
            /**int1和int2都指向方法区中常量池中的同一内存空间*/
            int int1 = 1;
            int int2 = 1;
    
            System.out.println(intger1 == intger2);//false
            System.out.println(int1 == int2);//true
        }
    
    }

     分析2

    package com.hs.jvm;
    
    /**JVM在类加载的时候,将类的信息放入方法区*/
    public class JVMTest2 {
    
        /**J将方法的信息放入方法区*/
        public static void main(String[] args){
    
            /**
             * People类:People类的信息在方法区中
             * People实例对象:new出来的People实例对象在堆中,并持有对方法区People类信息的引用
             * p:p是对new出来的People实例对象的引用,放在栈中,指向new出来的People实例对象内存地址
             * */
            People p = new People("TYJ", 18);
    
            /**
             * 执行playing方法时
             * 先根据p定位堆中的People实例对象
             * 再根据People实例对象找到方法区People类的playing方法字节码
             * 最后执行playing方法
             * */
            p.play();//TYJ is playing
        }
    
        /**main方法的执行逻辑
         * (1)用户创建了一个People对象,运行时JVM首先会去方法区寻找该对象的类型信息,没有则使用类加载器classloader将People.class字节码文件加载至内存中的方法区,并将People类的类型信息存放至方法区。
         * (2)接着JVM在堆中为新的People实例分配内存空间,这个实例持有着指向方法区的People类型信息的引用,引用指的是类型信息在方法区中的内存地址。
         * (3)在此运行的JVM进程中,会首先起一个线程跑该用户程序,而创建线程的同时也创建了一个虚拟机栈,虚拟机栈用来跟踪线程运行中的一系列方法调用的过程,每调用一个方法就会创建并往栈中压入一个栈帧,栈帧用来存储方法的参数,局部变量和运算过程的临时数据。上面程序中的p是对People的引用,就存放于栈中,并持有指向堆中People实例的内存地址。
         * (4)JVM根据p引用持有的堆中对象的内存地址,定位到堆中的People实例,由于堆中实例持有指向方法区的People类型信息的引用,从而获得add()方法的字节码信息,接着执行add()方法包含的指令。
         */
    }
    ------------------------------------------------------------------
    package com.hs.jvm;
    
    public class People {
        private String name;
        private int age;
    
        public People(String name, int age) {
            this.name = name;
            this.age = age;
        }
        public void play(){
            System.out.println(this.name + " is playing");
        }
    }
  • 相关阅读:
    backup archivelog delete input 与delete all input 区别
    RMAN LIST
    RMAN '异机异目录恢复'
    linux系统日志解析
    rman备份丢失控制文件,利用dbms_backup_restore恢复
    同义词的妙用
    上季度的老毛病又来了
    ORA20446,再次遭遇oracle bug
    修改RAC VIP IP
    数据库慢,原来与数据库无关
  • 原文地址:https://www.cnblogs.com/wobuchifanqie/p/10772323.html
Copyright © 2020-2023  润新知