您现在的位置是:首页 > 文章详情

Java程序运行时内存分析

日期:2019-04-07点击:362

Java程序运行在Java虚拟机中,JVM把他管理的内存分为三个区域:栈Stack、堆Heap、方法区Method Area

栈描述的是方法执行的内存模块,每个方法的调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量),栈属于线程私有、不能实现线程中的共享,连续空间,速度快。

堆用于存储创建好的对象和数组,JVM只有一个堆,被所有线程共享堆是一个不连续的内存空间。分配灵活,速度慢,
new执行完就放进堆。

方法区又叫静态区JVM只有一个方法区,被所有线程共享,方法区实际也是堆,只是用于存储类、常量相关的信息,
用来存放程序中永远不变或唯一的内容(类信息【class对象】、代码、静态变量、字符串常量。

package 内存分析; public class Person { int age; String name; Person(int age,String name){ this.age = age; this.name = name; } public static void main(String[] args) { int i = 20;//一 String name = "张三";//二 Person p1 = new Person(i,name);//三 Person p2 = p1;//四 Person p3 = new Person(30,"李四");//五 System.out.println("p1的个人信息:"+p1.age+","+p1.name);//六 System.out.println("p2的个人信息:"+p2.age+","+p2.name);//七 System.out.println("p3的个人信息:"+p3.age+","+p3.name);//八 } } 

第一步:JVM从硬盘中读取Person.class类文件,通过类加载器把类Person转载到内存中,在方法区中存放了Person原型。
第二步:在方法区中找到main方法,在栈中创建一个main方法栈帧,并开始执行main函数
第三步: 执行代码第一行,因为i是main方法中的局部变量,所以存放在main栈帧;执行代码第二行,定义一个String引用name,指向存放在静态区中的字符串常量“张三”;第三行,new一个Person对象,并调用了构造方法Person(int,String)进行初始化,定义一个引用p1,并在p1中存放了该对象的地址。具体的执行过程如下:首先执行=右边的new Person,通过new在堆中申请了一块内存,存放新建的对象数据,包含对象属性及地址,调用构造函数会在栈中创建一个Person栈帧。一个方法的形参是这个方法中的局部变量,所以i和name存放在person栈帧中,代码执行结束后,会撤销Person方法栈帧。表达式new person的值返回一个地址值,并赋值给了p1。第五行类似于第三行。
xin

初学Java,请各位前辈多多指教!文章若有侵权,麻烦马上联系我哦

原文链接:https://yq.aliyun.com/articles/697225
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章