1、栈(stack)是存放方法的局部变量的内存空间,每个方法都会分配一块内存空间frame,方法一旦执行完成,frame就被销毁,对于原始类型,变量的值也保存在stack中,对于引用类型,stack里保存的是指向对象的内存地址(引用)
</br>
2、堆(heap)是存放的Object,java是传值的,不是传引用的。
</br>
3、垃圾回收器GC(Garbage Collection):
局部变量方法在执行完后内存马上被回收。
Heap里面的对象由GC自动回收。
GC维护和检测对象的引用,当引用数为0时自动回收。
GC并不是实时回收的。
以下面的程序为例来说明jvm内存中的Stack,Heap和GC(垃圾回收):
第一步:在程序未执行时的堆栈如下图
第二步:开始执行main()方法,首先jvm会先为main方法分配一段内存空间,内存又依次为rate,money,zhangsan开辟空间,因为zhangsan是引用数据类型,所以jvm会在Heap中创建对象,分配一段内存空间,Stack中的zhangsan指向Heap中为zhangsan这个对象的内存地址
第三步:接着执行task1,jvm为task1方法分配内存空间,task1中有两个变量rate和hour,jvm会从main的内存中将rate的的值传递过来,同时为hour分配空间,如下图
第四步:task1执行完,jvm会自动释放内存,task1的内存块将不存在
接下来将执行task2,传递一个person进来,jvm会给person和hour分配内存空间,person同样指向heap中的内存空间,它是main方法中zhangsan的引用
最后,task2执行完后,jvm自动回收task2的内存空间,接着回收main函数的内存空间,然后没有任何对象指向Heap中的zhangsan,jvm就会回收Heap中的zhangsan对象的内存空间
下回补充 静态区知识(也就是带和不带static的区别)。
Systemgc()是“呼叫”垃圾回收器回收垃圾的,这么说不太严谨,其实但是只是“通知”而已,具体回收不回收由垃圾收集器的算法决定,你完全可以开发一个什么也不干的垃圾收集器,或者等内存被占用超过一定比例再回收的垃圾收集器。
finalize()方法是一个类对象在销毁时会被调用的方法,垃圾收集器在发现这个类对象不会再被使用时就会回收内存,也就是销毁该对象,从而finalize()被调用了。你这个程序Systemgc()是最后一句,显然前一句创建的Book对象后面不会被使用了,所以JDK带的垃圾回收算法就会调用该对象的销毁方法来回收了。
GC是garbagecollection缩写,翻译过来就是垃圾回收一个跟踪过程,
它传递性地跟踪指向当前使用的对象的所有指针,以便找到可以引用的所有对象,然后重新使用在此跟踪过程中未找到的任何堆内存。公共语言运行库垃圾回收器还压缩使用中的内存,以缩小堆所需要的工作空间。
当程序向 *** 作系统申请的内存不再需要时,垃圾回收主动将其回收并供其他代码进行内存申请时候复用,或者将其归还给 *** 作系统,这种针对内存级别资源的自动回收过程,即为垃圾回收。而负责垃圾回收的程序组件,即为垃圾回收器。垃圾回收其实一个完美的“SimplicityisComplicated”的例子。
一方面,程序员受益于GC,无需 *** 心、也不再需要对内存进行手动的申请和释放 *** 作,GC在程序运行时自动释放残留的内存。另一方面,GC对程序员几乎不可见,仅在程序需要进行特殊优化时,通过提供可调控的API,对GC的运行时机、运行开销进行把控的时候才得以现身。
以上就是关于堆,栈和GC详解全部的内容,包括:堆,栈和GC详解、GC似乎使java服务器应用程序无反应问题,怎么解决、清gc是什么意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)