关于堆、栈和方法区

JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)

  堆区:

  1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)

  2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身

  栈区:

  1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中

  2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。

  3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

  

  方法区:

  1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。

  2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

时间: 2024-08-25 02:37:19

关于堆、栈和方法区的相关文章

JVM_02 堆、栈 、方法区概念和联系

一.三者联系 1.堆:解决数据的存储问题( 即 数据怎么放,放到哪 ). 2.栈:解决程序运行的问题( 即 程序如何执行,或者说如何处理数据 ). 3.方法区:辅助堆栈的一块永久区,解决堆栈信息的产生,是先决条件. 我们创建一个对象,User:那么 User类的一些信息 (  类信息.静态信息 ) 都存在于方法区中,我们可以根据这些信息来创建对应的对象.方法区中相当于存放着创建对象的模板. 二.堆 1.根据垃圾回收机制不同, 堆有可能拥有不同的结构,最常见的就是将整个堆分为新生代和老年代.其中新

Java中堆、栈、方法区的联系

引言:Java中堆.栈.方法区的联系,为了更好的理解三者间的关系,本文用Test类的 声明->调用 来简单的展示这一过程. Test类: 一.编译时 在编译时会将对象Test . 常量和静态方法存入方法区 方法区分为2块: 1.对象区(加载时会将静态成员直接加载进去) 2.常量区 二.实例化时 在对象实例化时,会在堆中为对象分配一块空间. 三.调用对象的方法时 次出有2种情况: 1.静态方法调用 会直接去方法区找到add()方法进栈使用,使用完弹栈. 2.非静态方法调用 原文地址:https:/

内存分配及变量存储位置(堆、栈、方法区常量池、方法区静态区)

转载来源:http://www.cnblogs.com/protected/p/6419217.html 侵删! 程序运行时,有六个地方都可以保存数据: 1. 寄存器:这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部.然而,寄存器的数量十分有限,所以寄存器是根据需要由编译器分配.我们对此没有直接的控制权,也不可能在自己的程序里找到寄存器存在的任何踪迹. 2. 堆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中(new 出来的对象).驻留于常规RAM

Java中的堆、栈、方法区

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

JVM内存初学 堆、栈、方法区

转自: http://www.open-open.com/lib/view/open1432200119489.html 这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有比较大的帮助.废话不想讲了.入主题:先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 堆区:1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令)2.jvm只有一个堆

堆、栈、方法区、直接内存

堆(heap):FIFO,所有线程共享的一块内存,是专门存放对象实例的地方,GC发生在这里.随JVM启动而创建 栈(stack):LIFO,应该叫做虚拟机栈,每个线程私有的,存放该线程调用的方法栈帧,存储局部变量表.操作数栈.程序出口.动态链接等,每一个方法的调用就是入栈出栈的过程. 方法区(non-heap):存放已经加载过的类信息.静态变量.常量等不容易发生GC的信息,由各个线程共享(由静态变量或者常量可推知). 程序计数器:存放当前程序执行的字节码的行号指示器,如果执行的是native方法

JVM 运行时数据区:程序计数器、Java 虚拟机栈和本地方法栈,方法区和堆

Java 虚拟机可以看作一台抽象的计算机,如同真实的计算机,它也有自己的指令集和运行时内存区域. Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存(运行时内存区域)划分为若干个不同的数据区域. 如下图所示: 一.程序计数器 Program Counter Register 定义:程序计数器是当前线程所执行字节码的行号指示器. 原因:Java 中的多线程是线程间轮流切换并需要 CPU 给予时间片的方式实现的.在任何一个确定的时刻,都只有一个线程在执行指令.为了线程间轮流切换后能够快

堆、栈、方法区的区别

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

jvm内存模型中-栈,方法区,程序计数器是线程安全的

文章转自  https://www.cnblogs.com/myna/p/7567889.html 引文 JDK7及之前版本的方法区(Method Area)和Java堆一样,是各个线程共享的内存区域,用于存储已经被虚拟机加载的类信息.常量.静态常量.即时编译器编译后的代码等数据.虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但它有另外一个名字叫Non-Heap(非堆).根据Java虚拟机规范的规定,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常. 细分 方法