java中的栈、堆、方法区

栈(stack)
Java栈与堆不同每一个线程都有一个stack,栈的区域非常小,大概只有1M左右,但是存储速度非常快,所以我们把快速执行的任务存储在stack。

特点:自动分配,连续空间,先进后出原则。

1、基本数据类型(一共有八种:char、byte、short、int、long、float、double、boolean)直接分配在栈空间。

2、引用数据类型直接分配在栈空间,例如

int[] nums = new int[10];

这个nums就是对象的引用,JVM在栈空间分配了一个地址空间给nums,栈空间中的地址引用指向了堆空间中的对象。

3、方法的形式参数也直接分配在栈空间。

4、局部变量(在方法中定义,随着方法调用而存在,随着方法调用完毕而销毁,没有初始化的值,使用前必须定义和赋值)直接分配在栈空间,当局部变量所在方法执行完成之后该空间便立刻被JVM回收。

堆(heap)
在JVM中只有一个堆,在虚拟机开启时创建,所有的线程都共用这一个堆。

特点:是不连续,而且是被所有线程共享的内存区域。

1、存储创建new出来的对象,每个对象都包含一个与之对应的class的信息,而new对象的引用地址会储存在stack栈中。

2、存储数组。

方法区(method)
方法区(method)又叫静态区,

特点:方法区与堆一样是被所有线程共享的内存区域,方法区包含的都是整个程序中永远唯一的元素。

1、这里主要存储的就是类(class)、静态方法、静态变量、常量以及成员方法,还有我们常说的常量池也是方法区的一部分。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45817985/article/details/130839661