概述
首先简明扼要:
堆区:存储的是一切new出来的对象
栈区:存储基本数据类型的值和对象引用。每个栈中的数据( 基础数据类型和对象引用 )都是私有的,其他栈不可以访问。栈分为三个部分 : 基本类型变量区 , 执行环境上下文 , 操作指令区(存放操作指令)
方法区:保存所有的class文件和static变量与方法
1、栈
Java栈的区域很小,只有1M,特点是存取速度很快,所以在stack中存放的都是快速执行的任务,基本数据类型的数据,和对象的引用(reference)。
1.每个线程包含一个栈区,栈中只保存基本数据类型的数据和自定义对象的引用(不是对象),对象都存放在堆区中
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本数据类型的变量区、执行环境上下文、操作指令区(存放操作指令)。、
Java栈所占内存的大小由Xss来调节,方法调用层次太多会撑爆这个区域。
2、堆
类的对象放在heap(堆)中,所有的类对象都是通过new方法创建,创建后,在stack(栈)会创 建类对象的引用(内存地址)。
堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问 堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号
根据垃圾回收机制的不同,Java堆有可能拥有不同的结构,最为常见的就是将整个Java堆分为
新生代和老年代。其中新声带存放新生的对象或者年龄不大的对象,老年代则存放老年对象。
新生代分为den区、s0区、s1区,s0和s1也被称为from和to区域,他们是两块大小相等并且可以互相角色的空间。
绝大多数情况下,对象首先分配在eden区,在新生代回收后,如果对象还存活,则进入s0或s1区,之后每经过一次
新生代回收,如果对象存活则它的年龄就加1,对象达到一定的年龄后,则进入老年代。
3、方法区
method(方法区),他保存系统的类信息。比如类的字段、方法、常量池等。方法区的大小决定系统可以保存多少个类。如果系统定义太多的类,导致方法区溢出。虚拟机同样会抛出内存溢出的错误。方法区可以理解为永久区。
1.又叫静态区,跟堆一样,被所有的线程共享。
2.方法区中存放的都是在整个程序中永远唯一的元素。这也是方法区被所有的线程共享的原因。
举例 :
String s = new String(“nihao”)
堆中存储的是new出来的对象, jvm中只有一个堆区, 被所有的线程共享
栈中存储的是变量s, 每个栈中的数据私有的, 其他栈不可以访问
方法区存储的是"nihao" , 被所有的线程共享, 方法区包含所有的class static变量
最后
以上就是迷路时光为你收集整理的java中的 堆栈,方法区(永久代)的全部内容,希望文章能够帮你解决java中的 堆栈,方法区(永久代)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复