java中堆、栈和方法区的理解

百度上的答案太多,说的都比较抽象,请假大神们给我举例说明下
我自己的理解:
堆:存放对象、数组
栈:存放基础数据类型的对象和自定义对象的引用(不是对象)
方法区:存放class文件、常量、静态变量

4个回答

你理解的也没有问题只是不够全面。栈要分为虚拟机栈与本地方法栈。虚拟机栈:线程私有,生命周期与线程相同,描述的是Java方法执行的内存模型每一个方法执行的同时都会创建一个栈帧(Stack Frame),由于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法的执行就对应着栈帧在虚拟机栈中的入栈,出栈过程。本地方法站:作用是支撑Native方法的调用、执行和退出可能出现OutOfMemoryError异常和StackOverflowError异常有一些虚拟机(如HotSpot)将Java虚拟机栈和本地方法栈合并实现。
堆主要存放对象实例,在垃圾回收的时候有分为两个代,一个为新生代。一个老年代。其中老年带为经历过多次垃圾回收仍然存在的对象,新生代为没有经历过垃圾回收或者回收次数少的对象(如需了解可参见sun公司各收集器的机制)。
方法区就是存放class文件与类实现的内存空间。在HotSpot中也有永久带的叫法,但是在最新的据说要合并到堆中进行统一的垃圾回收管理。
希望我的回答能对你有帮助。想要 详细了解内存建议研读一下java虚拟机相关资料或者书籍

栈,具体应该叫 方法调用栈

lizehui_168
逆行者_168 ???
接近 2 年之前 回复
lizehui_168
逆行者_168 能说的再详细点吗?举例说明。谢谢
接近 2 年之前 回复
 AppMain.java

 public   class  AppMain                

//运行时, jvm 把appmain的信息都放入方法区

{

public   static   void  main(String[] args)  //main 方法本身放入方法区。

{

Sample test1 = new  Sample( " 测试1 " );   //test1是引用,所以放到栈区里, Sample是自定义对象应该放到堆里面

Sample test2 = new  Sample( " 测试2 " );

test1.printName();

test2.printName();

}

} 
Sample.java

 public   class  Sample        //运行时, jvm 把appmain的信息都放入方法区

{

/** 范例名称 */

private  name;      //new Sample实例后, name 引用放入栈区里,  name 对象放入堆里

/** 构造方法 */

public  Sample(String name)

{

this .name = name;

}

/** 输出 */

public   void  printName()   //print方法本身放入 方法区里。

{

System.out.println(name);

}

} 

图片说明

longlong3207
longlong3207 回复逆行者_168: a是引用,在栈里,new String("asd")是对象,在堆里
接近 2 年之前 回复
lizehui_168
逆行者_168 谢谢你的回答,但这个图都是百度上的,我也看过了,还是有点绕,比如String a = new String("abc"); abc是存放哪个位置;如果int a =123 那么123存放哪个位置?麻烦您再回答下
接近 2 年之前 回复

有一本 叫‘深入理解Java虚拟机 JVM高级特性与最佳实践‘的书讲的很全面,但是。。。我只能说。。我看一遍忘一遍仅仅了解个大概,楼主可以看看!!

lizehui_168
逆行者_168 谢谢分享
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
栈,堆,方法区的关系(自己理解)
栈,堆,方法区的关系简单JVM内存模型图在JVM中的栈,堆,方法区的数据交互在JVM中的栈,堆,方法区的内存交互 简单JVM内存模型图 堆区:存放的是使用new关键字创建的类或者数组的(含成员变量); 栈区:存放的是局部变量(注:形参也是局部变量的一种)和对象的声明引用; 方法区(常量池):存放的是字符串常量,其他基本数据类型的常量,方法区包含所有的class,方法区中包含的都是在程序中永远的唯...
java的栈,堆,静态区的理解
栈:主要用来存储定义的变量,对象的引用(不是对象),函数调用的现场,而每个栈中的数据都是私有的,其他栈不能访问。 堆:存储对象,一般有程序员释放,如果程序员没有释放,则程序结束后由系统自动回收。 静态区:存放静态数据,全局数据和常量
java 内存中 堆、栈、常量池、方法区的总结
详细的总结了java中在内存中创建的堆、栈、方法区、常量池的区别和用途
Java中栈、堆、方法区的关系以及作用
栈 Java 里的栈分为 虚拟机栈与本地方法栈,在大家口中经常说的栈,一般是指我们的虚拟机栈 虚拟机栈 Java 虚拟机栈(后面简称栈)是线程私有的,所以他的生命周期与当前线程是一样的,栈是用来描述方法执行的一个内存模型,因为每个方法在执行的同时,都会创建一个栈帧,而这个栈帧里面,又存储着局部变量表,操作数栈,动态链接,方法出口等一系列信息,下图为一般调用某一个方法时的栈内存图 最里层的局部变量...
解释栈、堆和方法区的用法
栈、堆和方法区都是属于内存中java用来存储数据的地方。、 1.栈中主要存放的是局部变量、方法参数以及方法帧等。每个线程都有自已的私有的栈不对外共 享。当执行到某个方法时,这个方法作为方法帧入栈,当执行完后出栈。 2.堆中主要用来存放的是对象。为所有的线程所共享。 3.方法区中存放的都是一些静态的数据,比如static变量、class等。为共享区域。方法区中都...
堆、栈、方法区的一点小知识
         另外,任何方法每次被线程调用时,都会在栈区开辟新的内存空间,所以多线程环境下,同一个方法在不同线程的执行下是互不干扰的,但成员变量是会干扰的,因为它存放在堆中。         当程序调用方法时,都会为该方法建立一个方法栈,方法中声明的变量就放在这个方法栈中,当方法结束时系统会释放方法栈,在该方法中声明的变量也会随着栈的销毁而结束,这就是局部变量只能在方法中有效的原因。...
Jvm---JVM的堆,栈方法区的详细和联系
1.堆,栈方法区的详细和联系 2.java堆: java堆是和应用程序关系最为密切的内存空间,几乎所有的对象都存放在堆上。并且java堆是完全自动化管理的,通过垃圾回收机制,垃圾对象会被自动清理,而不需要显示的释放。 根据java回收机制的不同,java堆有可能拥有不同的结构。最为常见的一种构成是将整个java堆分为新生代和老年代。其中新生代存放新生对象或者年龄不大的对象,老年代则存放老年对象。新...
(jvm-java虚拟机)栈,堆,方法区的关系
很多人虽然会些一些代码,但是并不知道这些数据,代码适怎样运行实现的,那我们就要来看看jvm(也就是java虚拟机)。                                  java虚拟机其实就是java程序运行的一个载体,java程序启动时,java虚拟机也就会相应的启动,当java程序的所有线程都结束的时候,自然而然的,载体也会停止工作 jvm在启动的过程中,会开
java-堆、栈、方法区的区别
一、定义  1、堆:FIFO队列优先,先进先出。堆存放在二级缓存中,调用对象的速度相对慢一些,生命周期由虚拟机的垃圾回收机制决定。 2、栈:FILO先进后出,暂存数据的地方。栈存放在一级缓存中,存取速度较快,“栈是限定仅在表头进行插入和删除操作的线性表”。 二、存储的数据类型 1、堆用来存储new出来的对象和数组 2、栈用来存储基本类型变量和对象的引用变量 三、优缺点
数据结构中的栈和堆,计算机系统内存中的栈和堆的理解
数据结构中的栈和堆,计算机系统内存中的栈和堆的理解
java中的栈和堆
1、栈(数据结构)--先进后出的结构,队列:是先进先出的结构       存放函数的参数,方法里的对象引用和局部变量;       1.1方法参数       1.2局部变量       1.3对象的引用       1.4基本数据类型 2、堆(数据结构)--特殊的树形结构,每一个节点都有一个值       存放new 出来的对象 3、常量池       字符串常量(Strin...
JAVA中的栈和堆
JAVA虚拟机栈:描述JAVA方法执行的内存模型,每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法创建一个栈帧,栈帧存放了当前方法的数据信息(局部变量),当方法执行完毕,该方法的栈帧就被销毁了。JAVA堆:被所有线程共享的一块内存区域,在虚拟机启动时创建。所有对象实例以及数组都要在堆上分配(使用new关键字,就表示在堆中开辟一块新的存储空间)...
Java中的堆与栈
JVM内存的划分: 1、寄存器————cpu进行处理 2、本地方法区————所在系统相关 3、方法区。 4、栈内存。 5、堆内存。 栈内存: 1、存储的都是局部变量,而且变量所属的作用域一旦结束,该变量所占用的内存空间就自动释放 2、优先读取主方法 堆内存: 1、存储的是数组和对象(其实数组就是对象),凡是new建立的都在堆中 2、特点: 1)存储的都是实体,每一个实体都有...
JAVA中的堆与栈
在Java语言中,堆与栈都是在内存中存放变量的地方。 在堆中,主要存放的是引用类型的变量(除了基本的变量类型:boolean(1), byte(8), char(16), short(16), int(32), long(64), float(32), double(64), void(-),所以 String类型变量,数组都是引用型变量),也就是在JAVA的运行过程中,通过new()创建的对象
Java中栈和堆
Java在内存中分为5个空间,1.寄存器,2.本地方法区,3.方法区,4.栈,5.堆基础点:1. 基本数据类型、局部变量都是存放在栈内存中的,用完就消失。2. new创建的实例化对象及数组,是存放在堆内存中的,用完之后靠垃圾回收机制不定期自动消除。本地变量:一种是原始类型(boolean,byte,short,char,int,long,float,double),会被存储到栈中,一种是对象的引用...
区别Java中堆与栈区别Java中堆与栈
区别Java中堆与栈区别Java中堆与栈区别Java中堆与栈区别Java中堆与栈区别Java中堆与栈区别Java中堆与栈区别Java中堆与栈区别Java中堆与栈
堆与栈的一个理解
堆和栈的理论知识rn2.1申请方式rnstack:rn由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间rnheap:rn需要程序员自己申请,并指明大小,在c中malloc函数rn如p1 = (char *)malloc(10);rn在C++中用new运算符rn如p2 = (char *)malloc(10);rn[color=#FF0000]但是注意p1、p2本身是在栈中的。[/color]rn我看到了一篇文章是这样写的。rn请问“p1、p2本身是在栈中的”是什么意思?rnrn我的理解是rn代表p1,p2的地址是在栈中的。rn因为我知道p1,p2代表一个地址,这个地址值是堆地址,而p1,p2的地址是栈地址。rn请问高手,我理解对吗?
堆,栈理解
堆内存栈和栈内存只是从java管理的角度来区分的,堆和栈又有详细的划分,无论怎么划分,这些内存都是并列的,无主次之分。 具体可以这样分 堆: 方法区(官方称为no-heap 非堆,只是为了区别开传统的堆内存,方法区本身就是堆内存,用于存放常量 方法数据 类信息),堆区(存放对象和数组),堆的三大特性为共享和存储量大以及运算慢 栈: jvm栈(通过创建帧来存放基本数据类型,对象引用,局部变量,
深入理解堆与栈
  大多数操作系统会将内存空间分为内核空间和用户空间,而每个进程的内存空间又有如下的“默认”区域。     1、栈:栈用于维护函数调用的上下文,离开栈函数调用就会无法实现。栈通常在用户空间的最高地址处分配,通常有数兆字节。      2、堆:堆用来容纳应用程序动态分配的内存区域,我们使用malloc 或者new分配内存时,得到的内存来自堆里。堆通常存于栈的下方(低地址方向),堆一般比栈大很多,...
Js 栈和堆理解
1.   Js栈内存      2.   Js 堆内存
栈和堆的理解
内存存储数据程序运行的时候,操作系统会给它分配一段内存,用来储存程序和运行产生的数据。这段内存有起始地址和结束地址起始地址是较小的那个地址,结束地址是较大的那个地址。堆(heap)                从低位到高位分配占据内存空间        用户通过动态的内存占用请求(如malloc命令,新建对象)        必须手动释放或通过垃圾回收机制来回收(不会自动消失)        先...
堆/栈的理解
栈(Stack) 是一种特殊的线性表,是一种后进先出(LIFO) 的结构   1.栈是限定仅在表层进行插入和删除运算的线性表,表尾称为栈顶(top),表头称为栈底(bottom) 2.栈的物理存储可以用顺序存储结构,也可以用链式存储结构 3.栈的方法(public void push (Object o){} ,public Object pop(){} public Object ...
堆、栈的理解及应用
栈与堆都是Java用来在Ram(内存)中存放数据(包括基本类型数据和包装类数据)的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。栈stack:存放基本类型的变量数据和对象的引用;存取速度比堆要快,但是存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。如int a = 3; 这里的a是一个指向int类型的引用;存在栈中的数据可以共享堆heap:存放所有new出来的对象和数...
堆,栈,队列的理解
...
堆、栈理解
堆(heap):先进先出(FIFO)也就是我们经常说的【队列】,一般是由程序员手工创建和释放,它是在程序运行的过程中申请分配的内存空间。经常被认为是二叉树(完全二叉树)。 栈(stack):先进后出(FILO)好比一个桶,把第一个东西放进去,却要最后一个出来,在程序编译的时候已经申请了空间。...
堆 和 栈 理解
内存有两个存储空间 堆  和 栈 简单类型:数据类型(整形、浮点型,布尔型)(放在栈里) 对象类型(容器,类实例化对象,迭代对象)(放在堆里) 例如: b = [1,2,3] b存在了栈里面,[1,2,3]存在了堆里面,地址存放在了栈里(通过地址指向堆里面的数据) 内存中栈的空间极小,堆的空间大,栈的存取速度更快(这就意味着非常消耗资源)   Copy问题 浅拷贝: 1.赋值 2.co...
堆 、栈的理解
java: 内存分配为 堆、 栈、方法区 、 本地方法区(和系统有关) 寄存器(给cpu 使用) 堆是存放new出来的对象;使用完后垃圾huis回收器chou抽时间回收 每个对象都有一个16进制的地址, 每个对象的数据都有默认值 int short long byte 0 char 空格           '\u0000' boolean             false 引用...
JAVA学习笔记(温故知新)——面向对象与面向过程的理解、对栈、堆和方法区的理解、构造方法(构造器)
1.面向对象与面向过程的理解   我们学习C语言时常用的思考方式是面向过程,面向过程即针对一个特定的问题去思考其解决步骤,一般较为简单,例如:做饭、洗澡、学车等,像这类我们都可以采用第一步干什么,第二步干什么的方式去思考。而面向对象则很难分出第一步做什么,第二步做什么。面向对象离不开面向过程,我们可以把面向对象当做一个个面向过程的组合,就比如造车,面向对象就是思考车这个对象是由什么组成的,而每一个...
对于java的堆、栈的自己理解
刚看了 关于堆和栈的博文,写下自己的理解加深影响。 1、堆(heap) 所有new出来的对象的都存放在堆里面,该对象的成员属性也和对象一起存放在堆中 2、栈(stack) 所有的局部变量,只要是基本数据类型的,如int,float等他的值和变量都存放在栈中,new出来的对象它的变量是存放在堆中的,也就是说程序通过在栈的中变量存储的内存地址找到在堆中的对象实际值,来达到访问数据的目的 3、
java基础 堆、栈 自我理解
栈 1 存入的值   1.1 函数参数值     1.1.1 方法内的参数P:A(int a,...)   1.2 局部变量     1.2.1 某方法或某代码段中的值   1.3 声明的值     1.3.1 例如:Persion p; 2 优点   2.1 存取速度快   2.2 数据共享 3 缺点   3.1 数据大小与生命周期必须确定,缺少灵活性 4 一级缓存
Java虚拟机的堆、栈、堆栈 如何理解
前言 开发过程中,每次用到静态成员,或者静态方法,就会很仔细,生怕用不好造成bug,归其原因就是对jvm了解甚少,那些在堆中存储,是线程间共享的,那些在栈中存储属于线程私有的。借用此文章进行回顾,堆栈作用 堆是堆(heap),栈是栈(stack),堆栈是栈。“堆栈”这种叫法,容易让新人掉坑里。 JVM规范让每个Java线程拥有自己的独立的JVM栈,也就是Java方法的调用栈。 Chapte
方法、对象、堆、栈
1.概念 即功能,封装了一段逻辑代码 2.方法的定义 1)固定语法: 修饰词 返回值类型 方法名(形参){ 逻辑代码 } 定义的过程,就是制定逻辑流程模板 2)修饰词: (1)public--公共的 (2)private--私有的 (3)protected--受保护的 (4)static 可以与上述三个连用 ...
Java中栈和堆的区别
1、栈主要存储的是局部变量,局部变量即定义在方法声明上和方法中的变量。 2、堆主要存储的是new出来的对象和数组。 以下面的代码进行分析: public static void main(String args []) { //数据类型 [] 数组名 = new 数据类型 [ 数组长度] int [] arr=new int [3];//假设系统给数组分配的地址为0x0000 ...
java中堆与栈的区别
java中堆与栈的区别 讲的比较详细比较 好 希望大家多多捧场
java中的内存分配(堆,栈)
栈 存储局部变量(局部变量指定义在方法中的变量) 使用完毕,立即回收 堆 存储的是new出来的东西,实体,对象 每个对象都有地址值 每个对象的数据都有默认值 byte,short,int long类型的默认值为0 flout,double的默认值为0.0 char类型的默认值为、\u0000 引用类型的默认值为 null 使用完毕后,等到垃圾回收器空闲时会回收 方法区 程序中...
Java中的栈、堆和方法区
一、栈内存: 1、 存放数据类型: 栈内存主要用于存放基本数据类型和对象的引用。而对象的数据访问,则是通过栈内存的指针,指向对应元素在堆内存中的位置实现的。 2、 线程机制: 栈内存不被线程共享。 3、 存取特征: 栈内存中的数据的大小和生存时间是固定的,因此存取速度快,仅次于位于CPU中的寄存器;但同时缺乏灵活性。 4、 销毁机制: 栈中没有垃圾回收机制,只有进栈和弹栈,进栈则分配内存,弹栈则释...
JAVA中堆,栈,解释
JVM将JAVA存储内容在内存中分为5个区,现在讲最重要的3个区: 例子: int a  = 1; int b = a; b = 3; class dog { private String name; }       dog "叮当" = new dog("叮当"); dog 小卷毛 = "叮当"; dog 小卷毛 = new dog("小卷毛")   1.栈     ...
Java中的堆、栈和常量池
Java中的堆、栈和常量池堆:存放所有new出来的对象; 栈:存放基本数据类型和对象的引用,对象本身并不是存放在栈中,而是存放在堆中或者常量池中; 常量池:存放基本数据类型的常量和字符串常量;对于字符串来说,其对象的引用都是存储在栈中的,如果编译期已经创建好了(即用引号定义的字符串,如:String str = “Java”)就存储在常量池中,如果是运行期(即new出来的对象)则存储在堆中。对于
java中的堆,栈总结
1、Java在编译和运行时期java通过编译产生的字节码文件,与平台无关。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。java在编译和运行时: 在编译时期:由java错码生成.class字节码文件。 在运行时期:由类加载器加载到jvm中,这时候程序为java程序分配内存空间。比如变量,方法,对象,返回值等。jvm把这些数
Java中堆与栈的区别?
概述:在Java中,内存分为两种,一种是栈(PC、Stack、Native Stack)内存,另一种是堆(堆、方法区)内存。 区别: (1)存放内容不同: 栈内存:用来存放基本数据类型变量和引用类型变量。 堆内存:用来存放运行时通过new关键字创建的对象。 (2)生命周期不同: 栈的生命周期与...
相关热词 c++和c#哪个就业率高 c# 批量动态创建控件 c# 模块和程序集的区别 c# gmap 截图 c# 验证码图片生成类 c# 再次尝试 连接失败 c#开发编写规范 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数