如何准确理解Java中的堆与栈

关于内存可以说是Java中的重要概念,而栈和堆又是内存中的两个重要部分。怎样理解栈和堆?栈可以理解为内存中一片连续的区域,而堆可以理解为内存中一片分散的区域。可以说,栈是用来运行程序的区域,当在栈里应用一个值的时候,这个值就会指向堆中的一个位置。其实可以理解为一种函数关系。在进一步理解堆和栈的关系,则要先理解一下Java虚拟机。

在学Java的过程中,有些人会写代码,但对数据的来源并不清楚,代码是怎样运行和实现的,和JVM也有着密切的关系。

一个Java程序需要在Java虚拟机(JVM)上运行才能得以实现,当java程序启动时,java虚拟机也会自动地开启,当java程序的所有线程都结束的时候,自然而然的,载体也会停止工作。

jvm在启动时,会开启虚拟机自身的线程,例如垃圾回收线程,还有java程序的线程,创建的线程名,同时创建对象和变量,这些都会放在JVM的栈中,而线程对象字符串,new的对象,变量,都会放在堆中;最后,变量的值,则会放在方法中,方法区和堆都是共享的,通过以上的叙述,就可以看出一些JVM的运行机制。

如果从数据的调用方面和对象的创建方面来说的话,堆,栈,方法区,是一个整体存在的东西,例如,一个String b=new String(“test”); 我现在new了一个对象b这个对象名放在栈中,b这个对象值(对象字符串)放在堆中,"test"就会放到方法区中,这样的分工机制有效提升了程序运行的速度。

由此可见,堆是java应用程序最密切的内存空间。可以说所有的对象都存在堆中。而且堆的管理是自动化的,通过GC回收机制,垃圾对象会自动清理,不需要显式释放。

因为垃圾回收机制各不相同,所以java堆可能有不同的结构。最常见的是将整个java堆分为新生代和老年代。尚学堂陈老师指出,老年代的数据最终要被消除,新生代存放新对象或者年龄不大的对象,老年代存放老年对象。新生代有可能分为eden区、s0区和s1区,s0区和s1区也被称之为 from 到to区域。

一般情况下,对象首先被分配在eden区,再一次新生代回收后,如果对象还存在,则会进入s0或者s1,而当对象年龄达到一定条件后,就会老龄化进入老年代。

以上就是对Java中堆与栈的理解,希望对正在学Java的朋友有所帮助。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180324A0O9JL00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券