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

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

在学Java的过程当中,有些人会写代码,但对数据的来源并不清楚,代码是怎样运行和实现的,和JVM也有着密切的关系。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的朋友有所帮助。
 字符串

相关文章
相关标签/搜索