java 堆栈方法区

先来一波Java的内存划分解释


java是如何管理内存的

java的内存管理就是对象的分配和释放问题。(其中包括两部分)

分配:内存的分配是由程序完成的,程序员需要通过关键字new为每个对象申请内存空间(基本类型除外),所有的对象都在堆(Heap)中分配空间。
释放:对象的释放是由垃圾回收机制决定和执行的,这样做确实简化了程序员的工作。但同时,它也加重了JVM的工作。因为,GC为了能够正确释放对象,GC必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等,GC都需要进行监控。

堆的优势是可以动态分配JVM内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配JVM内存的。缺点就是要在运行时动态分配JVM内存,存取速度较慢;栈的优势是存取速度比堆要快,缺点是存在栈中的数据大小与生存期必须是确定的无灵活性。
Java的内存需要划分成为5个部分:


1.栈(Stack):存放的都是方法中的局部变量。方法的运行一定要在栈当中运行。

  • 基础数据类型 byte short int long float double char boolean
  • 方法的形式参数,或是方法{}内部的变量,方法调用完后从栈空间回收
  • 引用对象的地址,引用完后,栈空间地址立即被回收,堆空间等待GC

栈中的每个元素为栈帧,线程调用每个方法时会将方法栈压入一个新帧,
帧里面存放方法参数,局部变量,运算过程产生的临时数据

每个线程包含一个栈区

每个栈中的数据(基础数据类型和对象引用)都是私有的,其他栈不能访问。

栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

2.堆(Heap):

  • this
  • new出来的对象,凡是new出来的东西,都在堆当中。
  • 数组
  • jvm只有一个堆区,并被所有线程共享。

堆内存里面的东西都有一个地址值:16进制
堆内存里面的数据,都有默认值。规则:

如果是整数类型:那么默认值为0
如果是浮点类型:那么默认值为0.0
如果是字符类型:那么默认值为\u0000
如果是布尔类型:那么默认值为false
如果是引用类型:那么默认值为null

3.方法区(Method Area):存储.class相关信息,包含方法的信息。

  • 字符串常量
  • static
  • 所有的class信息
  • 被所有线程共享, 其内存放程序中永远唯一的元素,eg: static class

4.本地方法栈(Native Method Stack):与操作系统相关。
5.寄存器(pc Register):与cpu相关。

实例

public class AppMain {// 运行时 jvm把类信息加入方法区
 
	/**
	 * @param args
	 */
	public static void main(String[] args) {// main方法放入方法区
 
		Sample test1 = new Sample("hello"); // test1是引用 放入栈中 new Sample("hello")对象放入堆中
		test1.printName();
		
	}
 
}
 
 
class Sample { // 运行时 jvm把 类信息放入方法区
	
	private String name; // new Sample()后, name 引用放入栈  name对象放入堆
	
	public Sample(String name){
		this.name = name;
	}
	
	public void printName(){ // 方法本身放入方法区
		System.out.println(name);
	}
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值