JVM 栈堆和方法区

  • 栈区

    • 栈区描述的是方法执行的内存模型。每个方法在执行时都会创建一个栈帧(存储局部变量、操作数栈、动态链接、方法出口等)
    • 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;        //这里不能使用私有类
    }
  1. java MainMemory,系统收到指令,启动一个java虚拟机进程
  2. 进程首先从classpath中找到MainMemory.class文件,读取该文件的二进制 数据,就是将类信息存放到运行时数据去的方法区中,整个过程是类加载过程,将其加载到方法区中
  3. Java虚拟机定位到方法区中MainMemory类的main()方法的字节码,执行了方法,会分配一个栈帧
  4. 创建一个实例对象,也就是在堆区分配一个对象的内存,给对象属性赋值
  5. 创建一个Data类对象,先加载该类,然后再分配对象内存,再给该对象赋值
  6. 调用store()方法,分配栈帧
  7. 调用release()方法,分配栈帧

原文地址:https://www.cnblogs.com/xiangyuguan/p/11305262.html

时间: 2024-11-06 08:45:34

JVM 栈堆和方法区的相关文章

JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )

这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有比较大的帮助.废话不想讲了.入主题:先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 堆区:1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令)2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身栈区:1.每个线程包含一个栈区,栈中只保存基础数

JVM 内存 (堆(heap)、栈(stack)和方法区(method) )

JVM 内存初学 (堆(heap).栈(stack)和方法区(method) ) 堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令)2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身 栈区: 1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中.2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问.3.栈分为3个部分:基本类型变

Java里的堆(heap)栈(stack)和方法区(method)

基础数据类型直接在栈空间分配, 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收.   引用数据类型,需要用new来创建,既在栈空间分配一个地址空间,又在堆空间分配对象的类变量 . 方法的引用参数,在栈空间分配一个地址空间,并指向堆空间的对象区,当方法调用完成后从栈空间回收.局部变量 new 出来时,在栈空间和堆空间中分配空间,当局部变量生命周期结束后,栈空间立刻被回收,堆空间区域等待GC回收. 方法调用时传入的 literal 参数,先在栈空间分配,在方法调用完成后从栈空间分配.

从几个sample来学习JAVA堆、方法区、JAVA栈和本地方法栈

最近在看<深入理解Java虚拟机>,书中给了几个例子,比较好的说明了几种OOM(OutOfMemory)产生的过程,大部分的程序员在写程序时不会太关注Java运行时数据区域的结构: 感觉有必要通过几个实在的例子来加深对这几个区域的了解 1)Java堆 所有对象的实例分配都在Java堆上分配内存,堆大小由-Xmx和-Xms来调节,sample如下所示: [java] view plaincopyprint? public class HeapOOM { static class OOMObjec

Eclipse中的快捷键快速生成常用代码(例如无参、带参构造,set、get方法),以及Java中重要的内存分析(栈、堆、方法区、常量池)

Eclipse中的快捷键快速生成常用代码(例如无参.带参构造,set.get方法),以及Java中重要的内存分析(栈.堆.方法区.常量池) 以上就是Eclipse中的快捷键快速生成常用代码(例如无参.带参构造,set.get方法),以及Java中重要的内存分析(栈.堆.方法区.常量池)的全部内容了,更多内容请关注:CPP学习网_CPP大学 本文固定链接:CPP学习网_CPP大学-Eclipse中的快捷键快速生成常用代码(例如无参.带参构造,set.get方法),以及Java中重要的内存分析(栈.

java栈、堆、方法区

1.java中的栈(stack)和堆(heap)是java在内存(ram)中存放数据的地方 2.堆区 存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令): jvm只有一个heap区,被所有线程共享,不存放基本类型和对象引用,只存放对象本身. 堆的优劣势:堆的优势是可以动态的分配内存大小,生存期也不必事先告诉编译器,java的垃圾收集器会自动收取这些不在使用的数 据,但缺点是,由于要在运行时动态分配内存,存取速度慢. 3.栈区 每一个线程包含一个st

java基础学习之内存分析(栈、堆、方法区)

栈存放:会为每个方法(包括构造函数)开辟一个栈指针,方法执行完毕后,会自动退出,并释放空间 局部变量 先进后出 自下而上存储 方法执行完毕 自动释放空间 堆: 存放new出来的对象 需要垃圾回收器来回收 方法区:其实也是在堆中的 存放类的信息(代码). static变量.字符串常量等 原文地址:https://www.cnblogs.com/ustc-anmin/p/10783101.html

03-JVM内存模型:堆与方法区

一.堆(Heap) 1.1.什么是堆 堆是用于存放对象的内存区域.因此,它是垃圾收集器(GC)管理的主要目标.其具有以下特点: 堆在逻辑上划分为"新生代"和"老年代".由于JAVA中的对象大部分是朝生夕灭,还有一小部分能够长期的驻留在内存中,为了对这两种对象进行最有效的回收,将堆划分为新生代和老年代,并且执行不同的回收策略.不同的垃圾收集器对这2个逻辑区域的回收机制不尽相同,在后续的章节中我们将详细的讲解. 堆占用的内存并不要求物理连续,只需要逻辑连续即可. 堆一般

JVM内存—堆(heap)栈(stack)方法区(method) (转)

JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 堆区:1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令)2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身栈区:1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问.3.栈分为3个部分:基本类