JVM学习笔记-JVM内存分配问题

分代模型分为 老年代 年轻代 永久代

在这里插入图片描述

回收过程

当开始执行一个方法的时候,创建一个栈帧将其压入栈中,如图所示,当执行完成之后弹出栈帧,此时该栈帧与堆内存实例出来的对象无关,所以回收线程可对堆内存实例化的资源进行回收

在这里插入图片描述

改造代码

此时我们将其改造一下
在这里插入图片描述

老年代与年轻代

将这个变量变成全局变量,此时,就会引出两个概念[年轻代]和[老年代]

年轻代就是创建很快就被回收的对象
老年代就是很久不被回收的对象
比如说案例一中不断新建不断回收-,就是一直在年轻代。
但是案例二创建了静态全局变量,这个对象一开始处于年轻代,不久之后会转成老年代

为什么要分年轻代和老年代

垃圾回收分两类,分别可以用不同的算法对其进行回收

什么是永生代?

永生代就比如方法区,存储一些类信息的

垃圾回收的时间

在年轻代的时期,并不是所有无关联的对象会被立刻回收掉,只有当年轻代内存堆积满了,到一定程度的时候,JVM会触发MinorGC机制,换种说法就是熟知的YoungGC机制

那么JVM如何判定年轻代可以进入老年代的?

-长期的年轻代会躲过多次回收
每次回收都会+1岁,也就是说假如躲过了15次,就是十五岁,JVM规定,当一个变量到达10岁的时候(躲过十次回收),他就是个老人了,将会被转移到老年代中

那么老年代也会有回收机制吗?

当老年代的空间满的时候,也会出现回收

JVM参数设置

Xss设置每个线程的栈内存大小
Xmx设置最大堆内存大小
Xms设置最小堆内存大小
Xmn设置新生代空间大小
XpermSize 永生代大小
MaxPermSize永生代最大大小

为什么要进行JVM调优?

支付系统支付业务案例,支付业务所需要的类有比如说订单流水号String,支付状态,用户id等等等,int4字节,long占八字节,累加起来即可估算一个订单占多少内存,假设产生一个订单会占用100字节的空间,那么每秒100单大概就是10000Byte,10Mb大小的字节,这些字节会在年轻代中,假如用完就放在那,等待新生代快被占满的时候99%的新生代会被回收。

但是假如说设想一下突然搞了大促,订单不是100单每秒了,变成1000单甚至更多,那么jvm会迎来更大的压力,现在100M,还有一些处理比较耗时,假如应付不过来,则在回收的时候来不及回收,假如说这些对象一次次的拖延,一次次的成长,到达十次之后,这些新生代对象会变成老年代对象,进入老年代空间,当老年代快被沾满时对其进行回收,但是很不幸的是,老年代回收的速度相对于新生代回收速度要慢很多。

JVM分类算法
对象标记

标记哪些是需要回收的,哪些是存活的,但是因为回收的东一块西一块的会造成很多的内存碎片。

复制算法

将内存分为两个区,一个是需要回收的区域,一个是存活区域,当对象将被回收结束引用的时候,移至回收区域,等待GC回收
但是这也有缺点,比如分配了1G的内存空间,每个都要被分512M,假如这一块内存用完了,将会回收并且将存活的对象移动到另个512M区域中,这样造成了一定程度上的闲置

更为优秀的算法是Eden和Suvivor算法

设计两块suvivor区,一块Eden区,当回收线程开始工作时,将待回收对象放入eden区,剩下的存活对象转移至另一块存活区,这样就不会闲置内存空间了

假如说一个对象过大,它被创建的时候是放在年轻代还是老年代?

假如一个对象过大,该对象在创建时不经过年轻代,直接进入老年代

关于触发FullGC回收的条件

1.MinorGC回收之前,发现需要进入老年代的对象太多了,老年代内存不足以支撑如此庞大的对象
2.MinorGC回收之后,发现剩余对象太多,老年代都放不下了。

老年代回收算法:
标记整理算法

给需要回收的对象做标记,然后回收整理,把存活的对象放在一边,紧紧靠在一起,避免产生过多的内存碎片,再将垃圾对象一起回收掉。

老年代回收算法要比年轻代回收算法慢
如果系统中频繁的发生老年代回收,系统会出现卡顿

什么时候会发生MinorGC?

新生代内存空间放不下新对象就会触发GC
触发MinorGC情况有:
新生代现有存活对象小于老年代剩余对象 即老年空间足以支撑可能晋升的对象
情况一不成立 查看设置的空间担保且可以担保成功

触发MinorGC之前如何检查老年代大小,涉及哪几个步骤条件?

判断新生代存活是否大于老年大剩余
条件一成立设置空间担保的情况下,判断老年代剩余是否大于之前进入老年代平均存活大小

什么时候在MinorGC之前就会触发一次FullGC

新生代现有存活对象>老年代剩余空间 未设置空间担保 或 空间担保失败

FullGC 算法是什么?

标记整理算法 速度很慢

Minor GC过后可能对应哪几种情况?

首先先判断存活对象是否大于老年代空间,可以则放入,否则尝试回收,假如回收之后还是塞不进去,就OOM

小于suvivor区域,进入survivor区域
大于suvivor区域,小于老年代可用空间,进入老年代
大于老年代空间,老年代FullGC回收一次
还大于老年代空间,抛出OOM

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值