java中堆内存和栈内存的区别(java中堆和栈内存的区别)

本文目录
java中堆和栈内存的区别
栈内存:
在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。栈内存主要存放的是基本类型类型的数据 如( int, short, long, byte, float, double, boolean, char) 和对象句柄。注意:并没有String基本类型、在栈内存的数据的大小及生存周期是必须确定的、其优点是寄存速度快、栈数据可以共享、缺点是数据固定、不够灵活。
栈的共享:
String str1 = "myString"; String str2 = "myString"; System.out.println(str1 ==str2 ); //注意:这里使用的是str1 ==str2,而不是str1.equals(str2)的方式。 //因为根据JDK的说明,==号只有在两个引用都指向了同一个对象时才返回真值 //而str1.equals(str2),只是比较两个字符串是否相等
结果为True,这就说明了str1和str2其实指向的是同一个值。
上述代码的原理是,首先在栈中创建一个变量为str1的引用,然后查找栈中是否有myString这个值,如果没找到,就将myString存放进来,然后将str1指向myString。接着处理String str2 = "myString";;在创建完str2 的引用变量后,因为在栈中已经有myString这个值,便将str2 直接指向myString。这样,就出现了str1与str2 同时指向myString。
特别注意的是,这种字面值的引用与类对象的引用不同。假定两个类对象的引用同时指向一个对象,如果一个对象引用变量修改了这个对象的内部状态,那么另一个对象引用变量也即刻反映出这个变化。相反,通过字面值的引用来修改其值,不会导致另一个指向此字面值的引用的值也跟着改变的情况。如上例,我们定义完str1与str2 的值后,再令str1=yourString;那么,str2不会等于yourString,还是等于myString。在编译器内部,遇到str1=yourString;时,它就会重新搜索栈中是否有yourString的字面值,如果没有,重新开辟地址存放yourString的值;如果已经有了,则直接将str1指向这个地址。因此str1值的改变不会影响到str2的值。
堆内存:
堆内存用来存放所有new 创建的对象和 数组的数据
String str1 = new String ("myString"); String str2 = "myString"; System.out.println(str1 ==str2 ); //False String str1 = new String ("myString"); String str2 = new String ("myString"); System.out.println(a==b); //False
创建了两个引用,创建了两个对象。两个引用分别指向不同的两个对象。以上两段代码说明,只要是用new()来新建对象的,都会在堆中创建,而且其字符串是单独存值的,即使与栈中的数据相同,也不会与栈中的数据共享。
java虚拟机jam的两个内存栈内存和堆内存的区别
您好,提问者:java中在内存中划分:栈内存和堆内存。1、栈内存:栈中是存放一些定义的变量的引用,比如:inta=1;a那么就存在栈内存中,java中垃圾回收是JVM帮我们完成的,这里比C大大提高了程序员的繁碎。如果想要控制可以使用System.gc();来通知JVM虚拟机执行,但是什么时候执行还是由JVM虚拟机来完成的。2、堆内存:堆中是存放一些比如数组,map类型等。
堆内存和栈内存的区别
Java把内存分成两种,一种叫做栈内存,一种叫做堆内存
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。
堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。
引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。而数组&对象本身在堆中分配,即使程序运行到使用new产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!
什么是栈内存和堆内存
栈内存在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
堆内存是区别于栈区、全局数据区和代码区的另一个内存区域。堆允许程序在运行时动态地申请某个大小的内存空间。
栈内存相比较于堆内存的优势
栈的存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。栈有一个很重要的特殊性,就是存在栈中的数据可以共享。

更多文章:
hibernate的sql语句在哪(hibernate中如何执行sql语句)
2026年1月5日 18:15
免费下载ppt模板网站建筑公司简介(求一款介绍公司简介的PPT模板,稍微好看一点详细一点的!)
2025年9月12日 18:45
springboot对应的spring版本(spring-boot集成spring-data-redis哪个版本)
2025年7月30日 01:45
asp可视化建站(关于建网站的(用asp做的)问题,请大家帮忙在线等)
2025年7月30日 22:00
2022pubg全球总决赛(绝地求生2022全球总决赛时间)
2025年8月11日 14:30
eclipse2020需要jdk什么版本(最新eclipse和jdk10可以一起用吗)
2025年8月26日 11:15
多线程线程池哪几种(什么是线程池为什么要使用线程池如何使用)
2025年10月15日 04:45
性格用英语怎么说personality(相貌和问性格的用英语怎么说)
2026年1月25日 00:45














