GC JVM内存分布 新生代和老年代

1、什么是GC?

GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的 GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的。

在内存中没有任何引用指向一个对象或者多个对象(循环引用),这些对象就变成了垃圾。

2、java jvm中定位垃圾的方法?

a、引用计数
b、根可达算法

3、垃圾回收器的基本原理?

程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象时“可达的”,哪些对象是不可达的。当GC确定一些对象为不可达时,GC就有责任回收这些内存空间。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。

4、常见的垃圾回收算法有哪些?

GC最基础的算法有三种:

标记清楚:位置不连续 产生碎片
拷贝/(复制)算法 : 没有碎片,浪费空间
标记压缩: 没有碎片,效率偏低

标记清除(Mark-Sweep)算法,如它的名字一样,算法分为“标记” 和“清除”两个阶段,首先标记处所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。
在这里插入图片描述

复制(copying)算法,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块,当这一块内存用完了,就将还存活的对象复制到另一块上面,然后再把已使用过的内存空间一次清理掉。
在这里插入图片描述

标记压缩算法,标记过程仍然与标记清除算法一样,但后续步骤不是直接对可回收的对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉边界以外的内存。
在这里插入图片描述

分代收集(Generational Collection)算法,把Java堆分为新生代和老年代,这样根据各个年代的特点采用最适当的收集算法。

引用计数(Reference Counting):比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。

5、有哪些垃圾回收器?
1、Seral 年轻代 串行回收
2、Parallel /Parallel Scavenge 年轻代 并行回收
3、ParNew 年轻代 配合CMS的并行回收
4、SerialOld 老年代
5、ParallelOld 老年代
6、ConcurrentMarkSweep (CMS)老年代并发的,垃圾回收和应用程序同时运行,降低STW的时间(200ms)
7、G1(10ms)
8、ZGC(1ms) 效果可以跟c++的垃圾回收媲美
9、Shenandoah
10、Eplison

1.8中默认的垃圾回收:Parallel + ParallelOld

Serial收集器,串行收集器,是最古老,最稳定以及效率高的收集器,可能会常产生较长的停顿,只使用一个线程去回收。

ParNew 收集器,ParNew 收集器其实是Serial收集器的多线程版本。

Parallel 收集器,Parallel Scavenge 收集器类似ParNew收集器,Parallel收集器更关注系统吞吐量。

Parallel Old 收集器,Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和标记压缩算法。

CMS收集器是一种以获取最短回收停顿时间为目标的收集器。

G1收集器,G1(Gatbage-First)是一款面向服务器的垃圾收集器,主要针对配备多个处理器及大容量内存的机器,以及高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征。


Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象。
在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor。

6、JVM中一次完整的GC流程是怎样的,对象如何晋升到老年代?

Java堆 = 老年代 + 新生代
新生代 = Eden + 2个suvivor区
当Eden区的空间满了,Java虚拟机会触发一次Minor GC,以收集新生代的垃圾,存活下来的对象会转移到surviror区。YGC回收之后,大多数的对象会被回收,活着的进入s0,再次YGC,活着的对象eden + s0 -> s1,再次YGC,eden + s1 -> s0

大对象(需要大量练习内存空间的java对象,如那种很长的字符串)直接进入老年代。
若果对象在Eden出生,并经过第一次Minor GC后仍然存活,并且被Survivor容纳的话,年龄设为1,没熬过一下Minor Gc(YGC)年龄+1,若年龄超过一定限制(15,CMS 6),则被晋升到老年态。即长期存活的对象进入老年态。
老年代满了而无法容纳更多的对象,Minor GC之后通常就会进行Full GC,Full GC 清理整改内存堆(包括年轻代和老年代)。
Major GC(Full GC)发生在老年代的GC,清理老年区,经常会伴随至少一次Minor GC,比Minor GC 慢10倍以上。

注:MinorGC = YGC MajorGC = FGC
新生代和来年代默认比例:
在这里插入图片描述

7、GC触发的条件?

a. 程序调用System.g
b.系统自身来决定GC触发的时机

8、可以作为GCRoots的对象有哪些?

虚拟机栈中引用的对象
方法区中类静态属性引用的对象
方法区中常量引用的对象
本地方法栈中引用的对象

9、导致Full GC出现的情况?

a、新生代设置过小:一是新生代GC次数非常频繁,增大系统消耗;二是导致大对象直接进入老年代,占据了老年代剩余空间,诱发Full GC
b、新生代设置过大会导致老年代过小(堆总量一定),从而诱发Full GC;二是新生代GC耗时大幅度增加
c、Survivor设置过小:导致对象从eden直接到达老年代
d、Survivor设置过大:导致eden区过小,增加了GC频率,一般来说新生代占整个堆的1/3比较合适。

10、GC策略的设置方式?

a、吞吐量优先,可由-XX:GCTimeRation=n 来设置
b、暂停时间优先,可由-XX:MaxGCPauseRatin=n 来设置

11、JVM性能调优?

a、设定堆内存大小
-Xmx: 堆内存最大限制
b、设定新生代大小。新生代不宜太小,否则会有大量对象涌入老年代
-XX:NewSize: 新生代大小
-XX:NewRatio 新生代和老年代占比
-XX:SurvivorRadio: eden区空间和survivor区空间占比
d、设定垃圾回收器 年轻代用 -XX:+UseParNewGC 老年代用-XX:+UseConcMarkSweepGC

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值