java中的堆,栈总结

1、Java在编译和运行时期

java通过编译产生的字节码文件,与平台无关。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。

java在编译和运行时:
在编译时期:由java错码生成.class字节码文件。
在运行时期:由类加载器加载到jvm中,这时候程序为java程序分配内存空间。比如变量,方法,对象,返回值等。jvm把这些数据保存到java虚拟机运行时的数据区(见图)。

这里写图片描述


2、java为什么会有堆栈内存之分?

对于堆栈,一般数据结构和算法上都有许多介绍。但是在这的堆栈和数据结构上的堆栈是不同的。这里的堆栈是指得到内存的可用部分。在存储数据或者对象的时候,要以合理的方式进行存储,比如说有些数据经常使用,有些不确定大小…。因此需要不同类型的存储方式。

从存储结构上来说
:存取速度比较快,有确定的生存期。比如说当执行一个方法时,在这个方法中定义的就是会保存到栈中,方法结束,内存栈也就销毁。因此定义的基本数据类型中保存到栈中的

:一种通用的内存池,用于存放所有的java对象,堆不见同于栈,:编译时期不需知道存储的数据在堆里存活多长时间,因此在分配存储时有很大的灵活性。当需要一个对象时,只需要new写一行简单的代码,当执行这断代码时,会在堆里面进行存储分配。当然,这种存储灵活性是要付出代价的,因此new出来的对象是比较耗费内存的,因为它分配和存储的时候需要更多的时间。

3、堆栈保存的示意图。

1、栈:保存八种基本数据类型
这里写图片描述
byte ,short ,int ,long,float,double,boolean,char除了这8大基本数据类型外,还保存了对象的引用。这个引用是一个地址指向,指向堆内存中的数据。
2、堆:保存对象实例。比如
Person p =new Person();
p:保存在栈中的引用。比如:0X0001。
p—->指向(其实为指针,一个地址指向实例)。
new Person():则是堆中保存的实例,其中我们设置的p.name,p.age也是保存在这里的。
这里写图片描述

4、堆栈的实例分析:

int a=2;定义保存在栈中,数据共享,因此a,b保存在栈中都指向的是2。
int b=2;
int c=3;如果栈中没有,则开辟新的空间存储。
Person p=new Person();//实例保存在堆中。
这里写图片描述

5、引用类型

数据类型分为两种:基本数据类型和引用数据类型。
基本数据类型:8种。
引用类型:类,接口,数组。
每种基本数据类型所对应的包装类就是引用数据类型,为什么有基本数据类型还要有包装类?java是一个面向对象的语言,在面向对象的世界里,所有的都看作对象,但基本数据类型不是对象,不是通过new产生的,为了解决这个不足,在设计类时为每一种基本数据类型设计一个包装类。
String不属于基本的数据类型,属于引用类型,因此有默认值Null。

6、常量池技术

java常量池技术  java中的常量池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复创建相等变量时节省了很多时间。常量池其实也就是一个内存空间,常量池存在于方法区中。
String类也是java中用得多的类,同样为了创建String对象的方便,也实现了常量池的技术。

==是比较是否为同一个对象;
equal是比较字符的值是否相同。

测试代码如下:
public class Test{
public static void main(String[] args){
//s1,s2分别位于栈中,指向堆中不同的空间
String s1=new String(“hello”);
String s2=new String(“hello”);
System.out.println(s1==s2);//输出false能
//s3,s4位于池中同一空间
String s3=”hello” String s4=”hello”;
System.out.println(s3==s4);//输出true
}
}
从上面可以看出,通过new产生的字符串实例保存在堆中,通过s1,s2==比较的是否同一个对象,因此false,但是s3,s4保存在常量池中,常量池中只有一个,因此通过==输出true。

7、常量池位于jvm的哪里?

java虚拟机运行时的数据区

这里写图片描述
上面jvm运行时数据区分布图片:一共5个区域,那么常量池位于哪里?这里对上面5个区域做出总结。
1、程序计数器(也叫PC寄存器):位于处理器内部,存储最快,程序员不可控。
2、堆:存放所有的java对象。
3、栈:存放基本数据类型和对象引用。
4、虚拟机栈:虚拟机栈真正描述的是java方法在内存中的执行,从方法入栈到出栈的过程。
5、方法区:方法区一部分存储了
类的名称,类型:比如是class,还是interface,
存储了访问修饰符:是private或者public
存储子方法名称字段。
另外还有一个常量缓存池,也就是常量池,它保存在方法区中。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值