内存栈,堆,方法区

栈的特点:

  1. 栈描述的是方法执行的内存模型,每个方法被调用都会创建一个栈帧(存储局部变量,操作数,方法出口等)
  2. JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数,局部变量)
  3. 栈属于线程私有,不能实现线程间的共享
  4. 栈的存储特性是 先进后出,后进先出
  5. 栈是由系统自动分配,速度快,栈是一个连续的内存空间

堆的特点:

  1. 堆用于存储创建好的对象和数组(数组也是对象)
  2. JVM只有一个堆,被所有线程共享
  3. 堆是一个不连续的内存空间,分配灵活,速度慢

方法区(静态区)的特点:

  1. JVM只有一个方法区,被所有线程共享
  2. 方法区实际也是堆,只是用于存储类,常量相关的信息!
  3. 用来存放程序永远不变或唯一的内容(类信息class对象,静态变量,字符串常量等)

示例:

@Data
public class Student {

    private String id;
    private String name;

    void play(){
        System.out.println("我在玩游戏");
    }

    public static void main(String[] args) {

        Student student = new Student();
        student.id ="1";
        student.name="王哈哈";

        student.play();
    }

}

当类运行时 方法区就加载类的数据,创建一个栈帧,此时空间是这样的


1.png

当类加载 new Student() 时会调用Student类的构造方法,当没有构造方法时JVM会自动创建一个无参构造方法,此时空间是这样的

2.png

运行
student.id ="1"; student.name="王哈哈";
此时空间是这样的name 地址指向字符串 "王哈哈" 地址

3.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • java中内存分为3块分别为:栈、堆、方法区(实际上方法区存在在堆当中也可以说内存分为栈、堆,但是方法区比较特殊所...
    寂静的春天1988阅读 1,258评论 1 1
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,148评论 1 32
  • 在一个方法内部定义的变量都存储在栈中,当这个函数运行结束后,其对应的栈就会被回收,此时,在其方法体中定义的变量将不...
    Y了个J阅读 4,447评论 1 14
  • define _CRT_SECURE_NO_DEPRECATE include<iostream> include...
    林锦天阅读 262评论 0 0
  • 走了几段路 山丘,树林,河畔 反复蜕变 痛苦 总希望溜走的快 欢乐 总希望长久驻留 沙漏沉淀的岁月,仿佛 梦从一个...
    息为阅读 159评论 3 3