栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【JAVA中堆栈的理解】

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【JAVA中堆栈的理解】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

学习打卡--JAVA中堆栈的理解
  • 一、概述
  • 二、运行时进行动态内存分配
      • 对于堆内存的理解
  • 总结

一、概述

在Java中,内存分为两种,一种是栈内存,另一种就是堆内存。
1.堆内存是是Java内存中的一种,它的作用是用于存储Java中的对象和数组,当我们new一个对象或者创建一个数组的时候,就会在堆内存中开辟一段空间给它,用于存放。
2.栈内存是Java的另一种内存,主要是用来执行程序用的,比如:基本类型的变量和对象的引用变量

注: java8中,取消永久代,方法存放于元空间(Metaspace),元空间仍然与堆不相连,但与堆共享物理内存,逻辑上可认为在堆中

二、运行时进行动态内存分配

1.对于类文件的内容在一块内存存放,从而可以通过指针的方式来访问引用这块内存来获取类的方法,字段,常量等信息,这块内存区域在JVM规范中就是方法区;

2.对于动态创建的对象,需要一块内存来存放所有这些对象并通过对象引用来访问和引用该内存区域的对象,这块内存区域就是堆.同时在堆内存空间不够用时,JVM会自动进行垃圾对象的销毁回收;

3.对应函数调用,结合操作系统的知识可知,需要每个函数调用都对应自身独立的函数调用栈,在该函数调用栈中存放被调用方法的参数,局部变量,返回值和返回调用函数的地址等,所以需要一块内存区域来作为函数调用栈,这块内存区间就是栈。

4.每个线程都对应一个独立的栈,线程每次只能执行个方法, 然后在栈中创建一个该方法的栈帧.JVM根据指针执行的每一步实际就是执行一步步的代码,虚拟机栈会对其进行记录,切换方法后就会生成新的栈帧

5.在线程的角度来看,堆和方法区是由该JVM进程的所有线程共享的,所有线程都在堆中获取内存用来存放自身在执行时创建的对象;从方法区获取该Java应用程序定义的类的信息;而栈是每个线程独立的,每个线程都有一个自身独位的栈和程序计数器PC,一个线程不能访问另外一个线程的栈和程序计数器PC。

对于堆内存的理解

JVM实现了垃圾对象的自动回收,在应用程序中,程序只需要根据需要进行对象创建即呵, JVM会自动回收不再需要的对象,释放对应的内空间。

所以为了便于对对象的管理和进行垃圾回收, JVM对于堆在整体上根据对象生命周期的长短不同,基于分代的思路来细分为:新生代,老年代。
其中新生代用于存放新创建的对象,老年代用于存放生命周期较长的对象,即在进行垃圾回收时,如果在此次垃圾回收不能销毁的对象,会从新生代移到老年代。同时对于需要占用太大内存空间的对象的内存分配,如果新生代没有足够的内存空间来存放,则也会直接在老年代分配内存来存放这种”大”对象。

为了方便基于分代来实现垃圾回收的算法实现,新生代进一 分为: Eden区,两个Survivor区, 即From Survivor区,To Survivor区,其中Eden区于存放新创建的对象,如果Eden满了 ,不能存放新创建的对象了,则会触发新生代垃圾回收,将新生代中所有不再需要的对象销毁,将还需要的对象移到,并递增对象的年龄。在之后的新生代垃圾回收中,将Eden和From存储的对象移到的To,空Eden和From,此时From变成了下次GC的To, To变成了From。在对象年龄达到一定大小,则从From直接移动到老年代了。

总结

简单整合下jvm堆栈的思路

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/995988.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号