jvm内存模型和GC垃圾回收机制

jvm内存模型:
在这里插入图片描述
如图所示,在jvm内存模型中
栈区本地方法栈程序计数器是线程私有的,而方法区堆区是线程公有的

他们里面分别用来存储什么东西呢?
栈区
虚拟机栈是线程私有的,每一个线程都会分配一个虚拟机栈,它描述的是Java方法执行的内存模型,每个方法执行时都会同步创建一个栈帧;用来存储方法的临时变量、数据,指令,返回地址等信息

堆区
堆是这几块内存区域中最大的一块,存放的是Java中的对象实例,比如说 Person p = new Person();new出来的这个p其实是一个指针,在栈区,但是p指向的对象内存其实是在堆区

方法区(元空间)
已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码、classLoader等数据

本地方法栈:
本地方法栈和虚拟机栈描述类似,区别只在于虚拟机栈描述的是Java方法,而本地方法栈描述的是Native方法(c++语言)。存的是一些c++的方法

程序计数器:
是当前线程执行字节码的指示器,通过改变它的值来选取下一条要执行的Java字节码指令。Java代码中的循环、跳转、异常处理、线程获得时间片后的恢复都需要依赖程序计数器。程序计数器所占内存很小,也是唯一一块不会出现内存溢出异常的内存区域。

GC垃圾回收机制

在这里插入图片描述
GC垃圾回收主要说的是对堆区的内存进行清理、整理
垃圾回收机制会将不被使用的内存清理,释放,以让出空间

GC怎么判断对象是否可以被回收?
1、引用计数法:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收(python中使用)

2、可达性分析法:从GCRoots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,那么虚拟机就判断是可回收对象。(java中使用)
在这里插入图片描述
从GC Roots开始,查找引用链,在引用链的就保留(如上面的object1、2、3),而没有任何路径到达的对象,就删除(如上面的Object5、6、7)
GC Roots的对象有:
1、虚拟机栈(栈帧中的本地变量表)中引用的对象
2、方法区中类静态属性引用的对象
3、方法区中常量引用的对象
4、本地方法栈中JNI(即一般说的Native方法)引用的对象

垃圾回收机制有几种算法:
1、标记-清理:将内存中需要被清理的打上标记,然后清理
缺点:这样零零碎碎的会产生很多内存碎片

2、标记-整理:先用标记-清理法清理之后,把内存碎片移动、整合到一起
缺点:代价大,成本高

3、复制法:将堆区一分为二,将一遍中还要用的内存标记起来,复制到另一半去,既清理内存,又整理好了,而且成本也不高
缺点:需要两倍内存

实际java中内存GC是怎么做的呢?
在这里插入图片描述
先将堆区进行划分:young年轻代、old老年代两个

young年轻代
young年轻代中,又分为Eden伊甸园区、Survivor(幸存) S0、Survivor S1三个区,这三个区的比例是 8:1:1
当我们在new对象的时候,其实是放在Eden伊甸园区中;

当Eden区快满了的时候,就会触发YoungGC垃圾回收,此时采用的是上面说的复制算法:将Eden中还需要的复制到S0区,然后将Eden和S1区的全部删除。
删除后当Eden区又快满了的时候,再进行复制算法,将需要的内存放到S1 区中去,然后将Eden和S0的全部删除,这样S0和S1交替和Eden一起删除,另一个保存
E + S1 复制到S0,E+S1清空;
E + S0 复制到S1,E+S0清空;
E + S1 复制到S0,E+S1清空;
。。。。。。
如此往复

Old老年代:
每一次YoungGC,幸存的内存的“年龄”就会加1,当幸存者年龄达到15岁的时候,也就是经过15次GC还没死的时候,就会被复制到老年代Old中,就不往Survivor中去了
另外,一些大的对象也会直接放在老年代中

新生代幸存者和大对象都往那老年代放,那老年代满了咋办呢?
老年代快满了,也会进行GC,一般会和Young年轻代一起GC,这时java程序暂停,全力进行垃圾回收,被称为Full GC(完全垃圾回收)

老年代的垃圾回收一般采用上面说的第一、二种方法,也就是标记-清理标记-整理算法,进行老年代的垃圾回收

好了,以上就是jvm内存模型和jvm的GC垃圾回收机制的简要描述了,点赞

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值