资讯专栏INFORMATION COLUMN

【Java】栈区、堆区和方法区的解析

suemi / 2708人阅读

摘要:栈区栈区描述的是方法执行的内存模型。创建一个实例对象,也就是在堆区分配一个对象的内存,给对象属性赋值创建一个类对象,先加载该类,然后再分配对象内存,再给该对象赋值调用方法,分配栈帧调用方法,分配栈帧参考面向对象内存分析堆区栈区方法区

栈区

栈区描述的是方法执行的内存模型。每个方法在执行时都会创建一个栈帧(存放存储局部变量、操作数栈、动态链接、方法出口等)

JVM为每个线程创建一个栈,栈属于线程私有,不能实现线程间的共享!用于存放该线程执行方法的信息(实际参数、局部变量等)

基本类型变量去,执行环境上下文,操作指令区(存放操作指令).

堆区

堆用于存储创建好的对象和数组(数组也是对象)

JVM只有一个堆,被所有线程共享

堆是一个不连续的内存空间,分配灵活,速度慢!

方法区

Jvm只有一个方法区,被所有线程公用

存放整个程序中唯一的元素。用于存放已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。如class static 变量.

内存分配
public class MainMemory {
    
        int id;
        String name;
        int size;
        Data data;
    
        void store() {
            System.out.println("执行存储中,存储数据类型:" + data.type);
        }
    
        void release() {
            System.out.println("释放内存中");
        }
    
        // 构造方法
        MainMemory(){
    
        }
    
        public static void main(String [] args) {
            MainMemory memory = new MainMemory();   //  创建一个对象
            memory.id=1;
            memory.name = "test";
            memory.size = 1024;
    
            Data data = new Data();
            data.type = "字符串";
            memory.data = data;
            
            memory.store();
            memory.release();
        }
    }
    
    class Data{
        public String type;        //这里不能使用私有类
    }

java MainMemory,系统收到指令,启动一个java虚拟机进程

进程首先从classpath中找到MainMemory.class文件,读取该文件的二进制 数据,就是将类信息存放到运行时数据去的方法区中,整个过程是类加载过程,将其加载到方法区中

Java虚拟机定位到方法区中MainMemory类的main()方法的字节码,执行了方法,会分配一个栈帧。

创建一个实例对象,也就是在堆区分配一个对象的内存,给对象属性赋值

创建一个Data类对象,先加载该类,然后再分配对象内存,再给该对象赋值

调用store()方法,分配栈帧

调用release()方法,分配栈帧

参考:面向对象内存分析
Java堆区、栈区、方法区

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75052.html

相关文章

  • JS从入门到放弃-基本类型和引用类型

    摘要:从入门到放弃基本类型和引用类型有七种数据类型而的变量根据指向数据类型的不同也分为两种类型一种基本类型一种引用类型基本类型基本类型包括这五种但凡变量指向这五种数据类型的都称之为基本类型假设有以上变量那么他们在内存中栈区的存储结构大概是这样子 JS从入门到放弃-基本类型和引用类型 JS有number,string,null,undefined,boolean,array,object七种数...

    walterrwu 评论0 收藏0
  • 谈谈javascript语法里一些难点问题(一)

    摘要:引子前不久我建立的技术群里一位问了一个这样的问题,她贴出的代码如下所示执行结果如下所示第一个第二个这是一个令人诧异的结果,为什么第一个弹出框显示的是,而不是呢这种疑惑的原理我描述如下一个页面里直接定义在标签下的变量是全局变量即属于对象的变量 1) 引子 前不久我建立的技术群里一位MM问了一个这样的问题,她贴出的代码如下所示: var a = 1; function hehe...

    huaixiaoz 评论0 收藏0
  • java学习(四) —— 内存分配浅析

    摘要:内存分配解析四方法执行完毕,立即释放局部变量所占用的栈空间。内存分配解析五调用对象的方法,以实例为参数。堆和栈的小结以上就是程序运行时内存分配的大致情况。 前言 java中有很多类型的变量、静态变量、全局变量及对象等,这些变量在java运行的时候到底是如何分配内存的呢?接下来有必要对此进行一些探究。 基本知识概念: (1)寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序...

    henry14 评论0 收藏0
  • JAVA GC 原理详解

    摘要:虚拟机栈区也就是通常所说的栈区,它描述的是方法执行的内存模型,每个方法被执行的时候都创建一个栈帧,用于存储局部变量表操作数栈动态链接方法出口等。每个方法被调用到完成,相当于一个栈帧在虚拟机栈中从入栈到出栈的过程。 大多数情况下我们对GC的了解都只是浅层含义上的,下面我们来详细讲解下内部的一些实现原理。讲解GC之前,我们得先了解下JVM的内存结构,才能让我们理解GC导致是干嘛的。 一.J...

    wangjuntytl 评论0 收藏0
  • 基本数据类型和引用类型的区别详解

    摘要:前两天看到大神的关于基本数据类型和引用类型的区别的文章觉得写得非常不错,就想着在其基础上加上自己平时看到的一些知识点和理解,所以就有了以下的文章基本数据类型基本数据类型包括基本数据类型是按值访问的,就是说我们可以操作保存在变量中的实际的值基 前两天看到kraaas大神的关于基本数据类型和引用类型的区别的文章觉得写得非常不错,就想着在其基础上加上自己平时看到的一些知识点和理解,所以就有了...

    CoffeX 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<