[入门]Java虚拟机之垃圾回收

前言

C语言、C++都是需要去申请释放内存,而java是自动垃圾回收
优势在于编写简单、不容易出错,手动申请释放内存容易出错在哪里?
1、没有回收
2、多次回收

什么是垃圾

没有被引用的、单个或多个对象
[图]<----表示什么是垃圾以及循环引用的垃圾

如何定位垃圾

1.引用计数法
需要一个计数器,在对象被引用时+1,当计数器减少为0的时候意味着可以被回收;需要额外的存储空间开销。
存在“循环引用”的问题,那在python中是如何解决的?

首先python在引用计数的基础上引入了标记-清除,不过这里找的是不可达的对象。
python使用双向链表来链接容器对象,容器对象上会有一个计数字段gc_refs。
对于每个容器对象,查找他所有引用的容器对象,然后减少找到的容器对象的gc_refs。检查完后再将所有gc_refs大于0的容器对象移动到不同的集合中。(注:大于0说明有引用外部对象)
接着找出这个集合中的容器对象所引用的对象,这些也不能被删除。
最后剩下的对象就是可以被回收的。

2.可达性分析
从根对象(GCRoots)扫描,所有扫描到的对象标记为可达,其他的就是不可达对象。
那么怎么定义GCRoots?
which instances are roots?
JVM stack
native method stack[本地方法栈]
run-time-constant pool[用到的类里边的常量池]
static references in method area[静态变量指向的那些变量]
Clazz
或者这么来看
1、每一个方法都有一个栈帧,正在跑的线程栈里的,在栈帧中的这些对象就是roots
2、类初始化的静态变量指向的对象
3、常量池
4、JNI指针引到的变量

垃圾回收算法

标记-清除(mark-sweep):位置不连续,有碎片产生。[图]
标记-复制(copying):没有碎片产生,但是浪费空间。通常新生代使用。[图]
标记-整理(mark-compact)[压缩]:没有碎片产生,不浪费空间,费cpu资源。[图]

JVM内存分代模型

新生代+老年代+(JDK:1.7)永久代+(JDK:1.8)matespace

永久代启动时必须设定空间大小,而在1.8更变为matespace后仅受物理内存限制,当然也可以指定一个大小,以防止代码出错导致oom。1.7的时候字符串常量放在永久代,而在1.8时放在堆中。这里特别说明MethodArea是一个逻辑概念,在1.7时叫做永久代,1.8时叫做元数据区(Matespace)
1、新生代 = Eden + 2个Servivor
a、YGC回收后,存活的放入s0,还在Eden的回收
b、第二次YGC,存活的放入s1,Eden和s0都会回收
c、第三次YGC,存活的放入s0,回收Eden和s1

在这些回收进行的期间,一旦被回收对象的年龄(没被回收次数)到设定的数值,就会放进老年代。
如果对象过大s区放不下,也会直接进入老年代。
最后老年代也装不下了,FGC。

常见的垃圾回收器

Serial
ParNew
Parallel Scavenge
Serial Old
Parallel Old
CMS[ConcurrentMarkSweep,并发的老年代垃圾回收器,减少STW]
G1
ZGC[STW1毫秒]当到1ms级别,已经可以媲美C++了
Shenandoah

上述这些回收器,除了ZGC、Shenandoah之外的GC都是采用逻辑分代模型
G1是逻辑分代,物理不分代
除此之外不仅逻辑分代、物理也分代,就是咱们熟悉的eden、servivor、tenured
在这里插入图片描述

JVM调优第一步

一般来说JVM调优就是尽量减少FGC的次数,并不是说整到没有FGC;如果没有指定,1.8默认的垃圾回收是Parallel Scavenge + Parallel Old;
Minor GC = YGC
Major GC = FGC

通过以下3个命令查看环境具体运行的参数设置
默认的JVM参数:java -XX:+PrintCommandLineFlags
最终参数值:java -XX:+PrintFlagsFInal
启动初始值:java -XX:+PrintFlagsInitial

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值