java 单进程内存_java执行程序的内存分析系列专栏

近段时间研究了java的程序执行过程中的内存分配,收获颇多,解决了我最近时间学习java的很多困惑点。写java内存分析系列的目的主要有两个,一来是希望给像我一样的java初学者一定的启发,希望也能解决的java关于内存方面的困惑点。二来也是给自己做个总结,毕竟只有自己亲自写出来的东西,才是真正的东西。今天就开始java程序执行过程内存分析系列第一篇。

一、 java执行程序时内存的划分

一般来说,作为初学者,一般只是将java程序的内存只是分为栈区,和堆区。确实刚开始学时这样划分能都便于我们理解,但是随着学习java时间的增多,如果内存划分还只是简单的只有栈和堆两个区,就有很多东西不能深入理解,就拿个常用的字符来说,就很难理解字符串的一些特性。于是乎我这里就增加一个内存区域的划分,这样比以前能理解更多的东西。这个新增的内存区域是什么呢?其实也不是新增,就是把以前堆内存划分为方法区和其他区。那方法区里面存放些什么东西勒,方法区里面主要存放三个东西,第一个是程序的代码,第二个是常量池,这里主要存放一些java程序中的一些常量和字符串常量,第三个是静态的变量。堆内存划分如图所示。

37b3d34aa5453b5c09858e2dc255a39e.png

二、.一个java程序执行过程中的内存分析

首先我定义了一个people类,里面有姓名和性别两个成员变量和一个说话的成员方法。另外还有一个测试类,测试people类,好了,万事俱备,只欠东风了。下面正式开始内存分析。

1 public classPeople {2 String name;//定义一个人的姓名

3 String sex;4 public voidspeak(){5 System.out.println("hi 你好");6 }7

8 }

1 public classTest {2 public static voidmain(String[] args) {3 People p = newPeople();4 System.out.println(p.name);5 System.out.println(p.sex);6 p.speak();7 }8 }

在程序开始运行时,执行的命令是 java Test(eclipse 刚开始也是要执行这句命令,就是在执行运行的命令时,就是在执行java Test),这时jvm也就是java虚拟机会把Test类加载到方法区,然后找到程序的test类的里面的main方法,作为整个程序的入口,开始运行整个程序。首先执行第三行命令people 怕= new people();执行这行代码时,内存中发生了到底哪些变化,当jvm遇到people p首先会执行jvm会到他管理路径下面找people类,如果没找到,就会报错,如果找到就会把people类加载到方法区,前面提过方法区里面主要存放一些代码和一些常量,然后栈内存中保存p引用变量,并初始化为null,加载完people类之后紧接着就执行new people(),jvm遇到new关键字到堆内存开辟一块空间,保存people类实例化的对象。并把这块内存的首地址赋值给p。具体如图所示。

a72a80e3230a79dc86c91d77770f44be.png

这里p引用的值是new people()对象的内存空间首地址。这里需要注意的是成员变量有个初始值,所有引用类型的初始值是为null,另外一个类创建的多个对象共享成员方法。

三、结语

分析到这里,内存分析系列一就到这里了,接下来我会继续深入内存分析,关于this,super以及static,string,和继承的内存分析,希望能对大家有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值