javaGC

一、内存模型
在这里插入图片描述
二、基本概念

1、程序计数器线程私有的一块内存空间,当前线程所执行的字节码的行号指示器):
   字节码解释器通过改变这个计数器的值来选取下一条需要执行的字节码指令,每个线程都对应一个独立的程序计数器, 记录着线程执行指令,保障了线程间的切换后能恢复到正确的执行位置,从而保障了Java虚拟机多线程能有条不紊地轮流切换执行。

2、Java虚拟机栈线程私有, 生命周期与线程相同
   每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

3、本地方法栈
   。。。
4、方法区 (永久区,各线程共享的内存区域
存储已被虚拟机加载的**类信息、常量、静态变量、**即时编译器编译后的代码等数据。

大小通过参数-XX:PermSize、-XX:MaxPermSize进行设置

5、Java堆 (内存中最大的一块,所有线程共享,存储Java对象实例)
对象分为:新生代和老年代

Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。

可通过-Xmx设置最大Java堆的大小,-Xms设置初始化时Java堆大小。

三、垃圾检测

1、引用计数法
a、给对象附加一个引用计数器,只要有一个地方引用它计数器值加1,当引用失效时就减1;
b、任何时刻计数器都为0的对象就是不可能再被使用的,将其判定为可回收的对象;
c、缺点:无法解决对象间循环引用问题(hashMap在高并发的时候会出现循环链表问题);优点:简单。

2、可达性分析算法
   通过一系列“GC Roots”的对象作为起始点向下搜索,搜索所走过的路径为引用链,当一个对象没有任何引用链与GC Roots相连,代表该对象不再被使用,将其判定为可回收的对象。

四、垃圾回收机制

1、标记-清除算法:先标记待回收的对象,然后再对标记的对象进行清除。
缺点:
a、标记和清除两个过程, 效率不高
b、标记清除后会产生大量不连续内存碎片

2、复制算法

内存分成两块,一块存储程序运行分配的对象,一块是空闲区域。
当存储对象的内存区域用完了,会将此区域存活的对象复制到另一块空闲区域,然后再把已使用的内存空间一次清理掉。

优点:简单高效;
缺点:可用内存缩小为原来的一半,以“空间换取时间”。

3、标记-整理算法
对原有标记-清除算法进行的改造,不是直接对可回收对象进行清理,而是让所有存活对象都向另一端移动,然后直接清理掉端边界以外的内存。

4、分生代算法

a、新生代生命周期短,每次经过GC后仍存活的对象年龄会加1, 多次GC后仍存活的对象会直接晋升为老年代;老年代的生命周期比较长
b、每次GC后新生代生存下来的对象很少,老年代存活对象多;
c、生存对象少的新生代更适合用复制算法,生存对象多的老年代适合用标记-清除或者标记-整理算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值