关于java堆_java中关于堆和(堆栈)栈的知识点记录

注:本文是整理总结网络上的帖子而成,如有错误之处还望大佬们指出

----------------------------------------------------------------------------

栈:分配的是基本类型和自定义对象的引用。

堆:分配的是对象,也就是new出来的东西。被所有线程共享。

方法区/静态区 存放的是类信息和static变量、常量。 被所有线程共享。

比如 User user=new User();

等号前半部分是自定义对象的引用 存在栈中

等号后半部分是创建对象 存在堆中

堆:java的垃圾回收器会自动的回收这些不用的数据。缺点是由于要动态的分配内存,存储效率会比较的慢。

栈:栈的优势是存取效率比较快,仅次于寄存器。但缺点是栈中的数据大小和生存期的固定的,缺乏灵活性。

一般每个方法的调用都会独立有一个栈来保存对象的引用变量,在方法返回后,栈会清空,当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。

栈:每个线程包含一个栈区,每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。

堆:jvm只有一个堆区被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身,几乎所有的对象实例和数组都在堆中分配。

堆:存储的全部是对象实例,每个对象都包含一个与之对应的class的信息(class信息存放在方法区)

方法区:又叫静态区,跟堆一样,被所有的线程共享。它用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

栈帧:也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构

jvm为每个创建的线程都分配了一个栈,对于java程序来说,运行程序就是对栈的操作完成的,栈以帧为单位保存线程的状态,执行两种操作,压栈和出栈

-------------------------------------------------------------------------

Java把内存划分成两种:一种是栈内存,一种是堆内存。

在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。

当在一段代码块定义一个变量时,Java的就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java的会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。

在堆中分配的内存,由Java的虚拟机的自动垃圾回收器来管理。

在堆中产生了一个数组或对象后,栈中声明的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就是数组或对象的引用变量。

----------------------------------------------------------------------------

栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:

int a = 3;

int b = 3;

编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3.接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3.这样,就出现了a与b同时均指向3的情况。这时,如果再令一个= 4;那么编译器会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令一个指向4;如果已经有了,则直接将一个指向这个地址因此一值的改变不会影响到b的值。要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况一个的修改并不会影响到b,它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量

------------------------------------------------------------------------------

JVM规范让每个Java线程拥有自己的独立的JVM栈,也就是Java方法的调用栈。

JVM规范为了允许native代码可以调用Java代码,以及允许Java代码调用native方法,还规定每个Java线程拥有自己的独立的native方法栈。

并不是说具体的JVM实现真的要给每个Java线程开两个独立的栈。以Oracle JDK / OpenJDK的HotSpot VM为例,它使用所谓的“mixed stack”——在同一个调用栈里存放Java方法的栈帧与native方法的栈帧,所以每个Java线程其实只有一个调用栈,融合了JVM规范的JVM栈与native方法栈这俩概念。

JVM的堆被同一个JVM实例中的所有Java线程共享。它通常由某种自动内存管理机制所管理,这种机制通常叫做“垃圾回收”(garbage collection,GC)。JVM规范并不强制要求JVM实现采用哪种GC算法。

未完待续...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值