栈、堆、方法区简介
来源:互联网 发布:js offsetparent属性 编辑:程序博客网 时间:2024/04/28 23:19
一. 栈、堆、方法区的简介
栈(stack): 1.为每个方法分配一个栈帧,栈帧之间不共享
2.存放局部变量:基本数据类型和对象的引用
堆(head): 1.存放对象
2.被所有线程共享
方法区(methodArea): 1.被所有线程共享
2.存放整个程序中永远唯一的元素:class(字节码指令),static(静态变量)和字符串常量
二. 举例子,详细阐述
以举例子的方式,介绍一个段代码在栈、堆、方法区中的内存分配情况和执行流程。
2.1 需要所举例子的元素
下面需要两个元素,第一:栈、堆、方法区的模型;第二:执行的一小段代码。
2.1.1 需要的栈、堆、方法区的模型
2.1.2 需要的代码
package test01;public class StackHeadMethod {public static void main(String[] args) {int a = 1;String b = "testBName";Test test = new Test();test.testMethod(a, b);}}class Test {private int testA;private String testB;private static final int testC = 2;public void testMethod(int testA, String testB){this.testA = testA;this.testB = testB;}}
三、进行内存分配流程的阐述
首先,JVM将StackHeadMethod.class、Test.class装载到方法区(JVM会执行启动类装载器、扩展类装载器和类路径装载器,在此只详细讲解针对本测试代码的字节码文件的执行)。其中方法区中的2是Test.java中的静态变量,在类加载的时候就在方法区中的静态存储空间分配内存。
然后,在StackHeadMethod.class文件中,找到main方法,开始执行main方法。将main方法在栈中开辟一个空间,称为栈帧。执行下面07、08、09、17、18、19行代码。
package test01;public class StackHeadMethod {public static void main(String[] args) {int a = 1; // 在栈中分配内存空间String b = "testBName"; // 在栈和方法区中分配内存空间Test test = new Test(); // 在栈中堆中分配内存空间test.testMethod(a, b);}}class Test {private int testA; // 在堆中分配内存空间private String testB; // 在堆中分配内存空间private static final int testC = 2; // 在堆和方法区中分配内存空间public void testMethod(int testA, String testB){this.testA = testA;this.testB = testB;}}
再然后,执行test.testMethod(a, b);这一行,在栈中新分配一个栈帧,调用test中的testMethod方法。
package test01;public class StackHeadMethod {public static void main(String[] args) {int a = 1; String b = "testBName"; Test test = new Test(); test.testMethod(a, b); // 在栈中分配空间}}class Test {private int testA;private String testB;private static final int testC = 2;public void testMethod(int testA, String testB){ this.testA = testA;this.testB = testB;}}
最后,testMethod方法执行完之后,testMethod栈帧从栈中释放空间,然后main方法执行完之后,main栈帧也释放空间,最后堆中的对象和方法区中的静态变量、字符串和字节码指令都没被使用时,根据java虚拟机的垃圾回收机制,进行对垃圾的回收。
以上,是执行一段代码,对内存进行开辟和释放的整个过程。
阅读全文
1 0
- 栈、堆、方法区简介
- 栈。堆。方法区
- 堆,栈,方法区
- 堆、栈、方法区
- jvm 堆、栈、方法区
- JVM:堆、栈、方法区
- Java 堆、栈、方法区
- JVM 堆,栈,方法区
- 堆区、栈区和方法区
- 堆_栈_方法区
- java堆、栈、方法区、常量池
- java堆、栈、方法区、常量池
- Java堆、栈、方法区、常量池
- jvm的堆,栈,方法区
- java内存--堆、栈、方法区
- java-堆、栈、方法区的区别
- JVM的栈、堆和方法区
- java堆内存、栈内存、方法区
- 五、java中的关键字
- Hessian 示例
- java中的类修饰符、成员变量修饰符、方法修饰符。
- 二分图最大匹配问题之网络流算法
- HTML标签
- 栈、堆、方法区简介
- 初学java,写个期末考试的题
- js关闭当前页面刷新父页面
- 微信分享给朋友圈/朋友/判断网络类型/支付在vue里面亲测
- js学习记录(ajax each() push())
- NavigationView实现侧滑效果
- Spring与Akka的集成
- JMock实践---(四)参数匹配
- 使用Intellij Idea创建第一个SpringMVC工程
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
长板品牌
长板基础动作二十招
长板教学
长板什么牌子好
长板和滑板的区别
长板怎么玩
滑板长板价格
长板一般多长
长板怎么拍照好看
长板滑板什么牌子好
长板的玩法
魔术师长板
长板品牌排行榜
长板拍照姿势
木雪长板
长板图片
长板吧
长板中国
长板平花
长板多少钱
板长
长板入门教学
长板动作
迪卡侬长板
长板 短板
长桌宴
实木长桌
长桌尺寸
6人长桌尺寸
洽谈桌
长棍面包怎么吃
法国长棍面包申遗
法式长棍面包
公园长椅
长椅简笔画
长椅英语
户外长椅
绿色长椅
长椅价格
长椅英文
长椅图片