导航:首页 > 编程语言 > 堆和栈和方法区java

堆和栈和方法区java

发布时间:2022-12-31 11:08:49

java中的,堆,栈,还有方法区都是用来放什么的

栈里存放的是值类型(int、float等)的值和引用类型(String、你自己创建的类对象等)在堆中的地址;堆中存放引用类u型的值,如果堆中某个值的地址在栈中没有被指向,他就会被GC回收。
方法区存储所有的类和静态变量。

② Java内存中的栈,堆和方法区的用法有什么不同

JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)也叫静态存储区。

堆区:

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

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

栈区:

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

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

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

方法区:

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

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

③ Java方法区和堆分别储存什么

静态变量、常量在方法区,所有方法,包括静态和非静态的,也在方法区。堆储存对象、数组、非静态变量。

④ 菜鸟:刚学java,堆区,栈区,静态区,代码区,晕了!!!!!

你问题太多了。简单为你解答一下吧,JAVA语言的内存管理分为栈内存,堆内存和方法区,栈内存用来存储基本数据类型和对象的引用(对象的实体和引用这两个概念你要搞明白),堆内存用来存储对象的实体。。你记住,JAVA是一门面向对象的语言,在JAVA理万事万物都是对象,除了两个东西:1,8个基本数据类型(对应的,还有8个相关的包装类,但是为了JAVA运行速度的考虑,SUN公司保留了这8个基本数据类型);2,就是你所谓的入口方法,即main方法;这两点是JAVA不是纯粹的面向对象语言的表现,也就是他比较特殊的地方,你记住就行了;接下来,我们来看栈内存和堆内存,JAVA里面所有东西都是对象,那么对象保存在哪呢?其实,对象里的所有东西保存在堆内存里,里面包括了这个对象的成员变量和方法等东西,而栈内存里,保存的是这个对象所属的这块堆内存的首地址?也就是一个16进制的数字,明白了?因为你要告诉JAVA虚拟机从哪里去开始读取这块堆内存啊。所以,你明白栈内存用来存储基本数据类型和对象的引用,堆内存用来存储对象的实体了。。而内存管理里面还有一块叫方法区,这是JAVA虚拟机用来在执行一个JAVA程序之前保存这个程序的结构等级的地方,虚拟机按照这个结构等级来调用程序里德对象方法等,而静态变量和静态方法正是保存在方法区里,所以静态方法可以在不创建对象的时候就调用,因为创建对象就是为对象分配堆内存,只有创建了对象之后才能调用对象的非静态方法和非静态变量。。你的第一个问题就能解答了,这个情况就是zhangsan的堆内存里保存的car对象的引用,而这个引用又指向car对象的堆内存;对象的成员变量是保存在自己的堆内存里的;而入口类是一个特殊的东西,你特殊对待就行了。

⑤ 请高手详细的解答一下JAVA的堆,栈,方法区,谢谢。

方法区(非堆):是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
java堆:是虚拟机中所管理的内存中区域最大的一块,是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。java堆是垃圾收集器管理的主要区域。
java虚拟机栈:线程私有的,它的生命周期与线程相同。每个方法被执行的时候都会同时创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机中从入栈到出栈的过程。

⑥ 求夹大神,java中将内存分为堆区,栈区,方法区。静态成员和方法位于方法区,局部变量在栈,对象在堆

Java内存的结构:
Java把内存划分为4个部分
1. 代码区 1、栈区 3、堆区 4、静态区域
其中栈的存取速度是最快的,所以局部变量以及一些小型的数据都
保存在栈区中,对象保存在堆区中。
静态区 :保存字符常量以及成员变量。
栈区中保存的变量就是保存变量的值。
引用数据类型:
栈区中保存的是对象在堆区的地址,所以也称作栈区的变量地址为引用

⑦ 重新理解jvm运行时的内存分布(堆栈方法区交互)

栈堆方法区的交互关系

java栈存储的本地变量表,包括八种数据类型和引用类型,引用类型指向对象的地址,保存在reference,指向java堆,对象类型数据会保存变量名,变量类型,变量值等,这些会存在方法区中去查看(在初始化的时候)。

在java栈中会存放对象实例(s1),但是他对象实例中具体的数据会由java栈中的引用指向java堆中的地址,里面的对象实例数据存放(实例名,实例相关类型,元数据信息。。。。),而静态变量,常量,类加载后的信息等会存放在方法区,在运行时需要调用的时候去方法区取,所以方法区和java堆都是共享的。而java栈时线程独有的数据(包括程序计数器,本地方法栈)。

一个jvm实例,只存在一个堆内存,堆内存的大小是可以调节的。类加载器读取了类文件之后,需要把类,方法,常量放到堆内存中,保存所有的引用类型的真实信息,以方便执行器执行。堆内存分为三部分。

(养老区就是老年代)

堆内存 逻辑上 分为三部:新生 +养老 +方法区

eden+survivor+Spaces(元空间或者叫方法区或者Perm)

Perm 永久存储区,是一个常驻内存的区域,用于存放jdk自身携带的Class,Interface的元数据,被装载进此区域的数据是不会被垃圾回收器回收的,只有关闭jvm后才会释放此区域所占用的内存。

如果出现OutOfMemoryReeor: PermGen space 说明java虚拟机堆永久带Perm内存设置不够,一半出现这种情况,都是程序启动加载大量第三方jar呆滞的,

对于HotSpot虚拟机很多开发者习惯将方法区称之为永久代(Parmenent
Gen),永久代是方法区的一个实现,这是不对的,方法区是逻辑上的部分。在jdk7中已经将原本放在永久代的字符串常量池移走了。

常量池( Constant Pool Constant PoolConstant Pool Constant Pool Constant Pool )是方法区的一部分, Class Class文件除了有类的版本、 字段方法、接口等描述信息外,还有一项就是常量池这部分内容将在类加载后进入。

伊甸园区,所有对象刚new出来都会放在这里。

对象分两种:
1.如果是大对象直接分配在Old区。
2.如果禁言了逃逸分析,会在栈上分配。
以上两种都不符合,放入伊甸园区。(Eden区)

看java7中如图:

对比java8

⑧ java中堆和栈的区别分析

JVM在内存中划分了三块(堆区、栈区、方法区)。程序经过编译后,JVM把.class文件加载到方法区,同一个类只有一个类对象在方法区,然后在堆区开辟内存区域,初始化实例对象,在堆区有一个指针指向方法区中class对象。栈区存放的是变量,变量指向堆区的实例对象。望采纳

阅读全文

与堆和栈和方法区java相关的资料

热点内容
dvd光盘存储汉子算法 浏览:757
苹果邮件无法连接服务器地址 浏览:962
phpffmpeg转码 浏览:671
长沙好玩的解压项目 浏览:144
专属学情分析报告是什么app 浏览:564
php工程部署 浏览:833
android全屏透明 浏览:736
阿里云服务器已开通怎么办 浏览:803
光遇为什么登录时服务器已满 浏览:302
PDF分析 浏览:484
h3c光纤全工半全工设置命令 浏览:143
公司法pdf下载 浏览:381
linuxmarkdown 浏览:350
华为手机怎么多选文件夹 浏览:683
如何取消命令方块指令 浏览:349
风翼app为什么进不去了 浏览:778
im4java压缩图片 浏览:362
数据查询网站源码 浏览:150
伊克塞尔文档怎么进行加密 浏览:892
app转账是什么 浏览:163