系统运维系列 之堆栈理解(java应用)

1 概述
java虚拟机内存分为:堆(heap)、栈(stack)、方法区(method area)等,整体来说:
堆:new出来的数组或者对象;
栈:存储局部变量;
方法区:代码区;
寄存器:给CPU使用。

2 详细介绍
堆:存放创建好的对象和数组(数组也是对象,new出来的对象存放在堆中),JVM中只有一个堆空间,它被所有线程共享;堆是一个不连续的内存空间,分配灵活,速度慢;
栈:方法执行的内存模型(属于线程私有,不属于线程共享),先进后出,后进先出,栈存储局部变量。栈由系统自动分配,速度快,栈是一个连续的内存空间;
方法区:(静态区),jvm只有一个方法区,被所有线程所共享,方法区其实也是堆,只是用于存储 类、常量相关的信息。

3 static、final修饰符、内部类和Java内存分配
static修饰符:static修饰符能够与属性、方法和内部类一起使用,表示静态的。类中的静态变量和静态方法能够与类名一起使用,不需要创建一个类的对象来访问该类的静态成员,所以,static修饰的变量又称作“类变量”。一个类中,一个static变量只会有一个内存空间,虽然有多个类实例,但这些类实例中的这个static变量会共享同一个内存空间;
final修饰符:在Java声明类、属性和方法时,可以使用关键字final来修饰,final所标记的成分具有终态的特征,final标记的类不能被继承,final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次,final一般用于标记那些通用性的功能、实现方式或取值不能随意被改变的成分;
内部类:内部类可以体现逻辑上的从属关系,同时对于其它类可以控制内部类对外不可见等,内部类可以直接访问外部类的成员,可以用此实现多继承。

4 生命周期管理
栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失;
堆中的对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性。

5 举例
字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。

//s1~s3均指向常量区,只有一份
String s1 = "AAA";  
String s2 = "AAA";  
String s3 = "AAA";  
//s4~s6是new出来的,存在堆区,有三份,常量池中只有一份
String s4 = new String("AAA");  
String s5 = new String("AAA");  
String s6 = new String("AAA");  

基础类型的变量和常量:变量和引用存储在栈中,常量存储在常量池中。
成员变量和局部变量:成员变量就是方法外部,类的内部定义的变量;局部变量就是方法或语句块内部定义的变量。局部变量必须初始化,局部变量的数据存在于内存中,栈内存中的局部变量随着方法的消失而消失。成员变量存储在中的对象里面,由垃圾回收器负责回收。

6 在JVM栈这个数据区可能会发生抛出两种错误
StackOverflowError 出现在栈内存设置成固定值的时候,当程序执行需要的栈内存超过设定的固定值会抛出这个错误;
OutOfMemoryError 出现在栈内存设置成动态增长的时候,当JVM尝试申请的内存大小超过了其可用内存时会抛出这个错误。

7 总结
在这里插入图片描述

参考资料:
https://blog.csdn.net/dyy0920/article/details/83654083 java中的堆栈
https://www.cnblogs.com/ffaiss/p/10681734.html java中堆栈(stack)和堆(heap)
https://blog.csdn.net/cx1110162/article/details/89705881 JAVA堆栈
https://www.zhihu.com/question/29833675 Java虚拟机的堆、栈、堆栈如何去理解?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值