JVM虚拟机中的基础内存划分以及程序运行过程

JVM中的内存分区

JVM做为Java程序运行的基础,是Java运行时必不可少的部分。

每一个jvm启动时,都会向系统申请一大块地址,因为他就是一个虚拟机,现实生活中的电脑不也需要人们安装内存条吗?虚拟机也是一样的,只不过他的内存是向系统申请的。在申请到内存以后,jvm将所得到的内存分为三个区,分别是栈、堆、方法区。其实方法区就包括在堆中,只不过因为方法区有特别的应用,所以人们将他分开来叫。

首先投入使用的是方法区。方法区主要存放类的信息,注意是类的信息,不是对象的信息,方法区是对所有的线程共享的,他主要保存类的代码,静态变量,静态方法,字符串常量。

在方法区存入类的信息之后,jvm找到main方法,开始运行程序。一旦开始运行main方法,jvm就在栈中创建了一段包含main方法的内存,栈是对线程私有的,每一个线程都有自己的Java栈,如果在main方法中还调用了其他的方法,就将这个方法入栈,这个方法操作完成之后就出栈。

在栈中的方法运行过程中,会涉及到一些操作,比如说要创建一个对象,那这个对象就保存在堆中,堆也是对所有线程共享的,简单来说,堆就是保存对象用的,当然也会保存对象中的方法和变量。这里面还涉及到内存回收的情况,就是如果内存不足了,要优先删除哪些对象来节省空间以便完成下一步的操作,这就是jvm的垃圾回收算法,下次讲。

实例

下面是一个类源代码,先看一下


public class SxtStu {
	
	//属性fields
	int  id;
	String  sname;
	int  age;
	
	Computer  comp;  //计算机
	
	//方法
	void  study(){
		System.out.println("我在认真学习!!,使用电脑:"+comp.brand);
	}
	
	void  play(){
		System.out.println("我在玩游戏!王者农药!"); 
	}
	
	//构造方法。用于创建这个类的对象。无参的构造方法可以由系统自动创建。
	SxtStu(){
		System.out.println("调用了无参的构造方法!");
	}
	
	//程序执行的入口,必须要有
	//javac  Sxtstu.java   ,   java Sxtstu
	public static void main(String[] args) {
		SxtStu  stu = new SxtStu();   //创建一个对象
		stu.id=1001;
		stu.sname= "高淇";
		stu.age = 18;
		
		Computer  c1 = new Computer();
		c1.brand = "联想";
		
		stu.comp = c1;
		
		stu.play();
		stu.study();
		
	}
}

下图就是这个程序在运行过程中的内存调用情况,结合前文所说的顺序,还是很容易看懂的
图中的15db9742和15db9752都是指这块内存的地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值