java中的 堆栈,方法区(永久代)

首先简明扼要:

堆区:存储的是一切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变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值