首页 > 编程语言 >Java GC

Java GC

时间:2022-12-07 15:04:46浏览次数:34  
标签:Java 收集器 对象 标记 回收 GC 垃圾


0. GC 
 

GC 是垃圾收集的意思 ,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会 导致程序或系统的不稳定甚至崩溃, Java 提供 的 GC 功能可以自动监测对象是否超过作用域从 而达到自动回收内存的目的 ,Java 语言没有提供释放已分配内存的显示操作方法 。Java 程序员不 用担 心内 存管 理, 因为垃圾收集器会自动进行管理 。要请求垃圾收集 ,可以调用下面的方法 之一 :System.gc() 或Runtime.getRuntime().gc() ,但 JVM 可以屏蔽掉显示的垃圾回收调用 。
垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低优先级的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。在 Java 诞生初期,垃圾回收是 Java最大的亮点之一,因为服务器端的编程需要有效的防止内存泄露问题,然而时过境迁,如今 Java 的垃圾回收机制已经成为被诟病的东。移动智能终端用户通常觉得 iOS 的系统比 Android 系统有更好的用户体验,其中一个深层次的原因就在于 Android 系统中垃圾回收的不可预知性。

Java GC_jvm

1. 如何确定垃圾

引用计数法:在 Java 中,引用和对象是有关联的。如果要操作对象则必须用引用进行。因此,很显然一个简单的办法是通过引用计数来判断一个对象是否可以回收。简单说,即一个对象如果没有任何与之关联的引用,即他们的引用计数都不为 0,则说明对象不太可能再被用到,那么这个对象就是可回收对象。

可达性分析:为了解决引用计数法的循环引用问题,Java 使用了可达性分析的方法。通过一系列的“GC roots” 对象作为起点搜索。如果在“GC roots”和一个对象之间没有可达路径,则称该对象是不可达的。要注意的是,不可达对象不等价于可回收对象,不可达对象变为可回收对象至少要经过两次标记过程。两次标记后仍然是可回收对象,则将面临回收。

2. 垃圾收集算法

标记清除:先标记,标记完毕之后再清除,效率不高,会产生碎片
复制算法:复制算法将可用内存按容量划分为相等的两部分,然后每次只使用其中的一块,当一块内存用完时,就将还存活的对象复制到第二块内存上,然后一次性清楚完第一块内存,再将第二块上的对象复制到第一块。
效率低,每次浪费一半内存。优化:不按照1:1分区。按照 8:1:1 分为 Eden 区和 survivor 区,就是上面谈到的 YGC. Eden区满则分配到servivor,servivor区满则通过分配担保机制分配到old。
标记整理:标记完毕之后,让所有存活的对象向一端移动。主要是为了解决标记-清除,产生大量内存碎片的问题

分代收集:将堆分为新生代和老年代。在新生代中,由于对象生存期短,每次回收都会有大量对象死去,那么这时就采用复制算法。老年代里的对象存活率较高,没有额外的空间进行分配担
保,所以可以使用 标记-整理 或者 标记-清除

Java GC_Java_02

3. 垃圾收集器有哪些? CMS 收集器与 G1 收集器的特点

并行收集器:串行收集器使用一个单独的线程进行收集, GC 时服务有停顿时间
串行收集器:次要回收中使用多线程来执行
CMS: 收集器是基于“标记—清除”算法实现的,经过多次标记才会被清除
G1: 从整体来看是基于“标记—整理”算法实现的收集器,从局部(两个 Region 之间)
上来看是基于“复制”算法实现的

Java GC_java_03

Java GC_开发语言_04

Java GC_Java_05

 

 

标签:Java,收集器,对象,标记,回收,GC,垃圾
From: https://blog.51cto.com/u_15905340/5919338

相关文章

  • java对象的访问
    Java程序需要通过JVM栈上的引用访问堆中的具体对象。对象的访问方式取决于JVM虚拟机的实现。目前主流的访问方式有句柄和直接指针两种方式。指针:指向对象,代表一......
  • java单例模式
    1.饿汉式2.懒汉式2.1 双重检查2.2 静态内部类2.3 枚举......
  • java虚拟机运行时数据区域
    一.线程私有1.程序计数器(ProgramCounterRegister) 当前线程所执行字节码的行号。2. Java虚拟机栈(JavaVirtualMachineStacks)Java方法执行的内存模型:每个方法在......
  • java面试(JVM)
     1. JMM的两个语义1)happensbefore:一个线程前一个操作对后一个操作可见,具有传递性。确保多线程执行程序结果不变。2)asifserial:无论怎么重排序,程序执行结果不变,即不......
  • Java语言标识符的命名规范(超详细讲解)
    前言在上一篇文章中,壹哥带领大家开始编写了第一个Java案例,在我们的cmd命令窗口中输出了”HelloWorld“这句话。并且我还给大家留了一个小作业,你做出来了吗?但是在上......
  • java拼接逗号的四种方式
    1.使用String.joinList<String>list=newArrayList<>(Arrays.asList("1","2","3","4","5"));Stringresult=String.join(",",list);System.out.println(result);......
  • Java数组和字符串的相互转换
    Java数组和字符串的相互转换字符串转换为数组JavaString类中的toCharArray()方法将字符串转换为字符数组,具体代码如下所示。Stringstr="123abc";char[]arr=......
  • JavaScript Promises, async/await
    newPromise()的时候,传一个executor给Promise.letpromise=newPromise(function(resolve,reject){//thisfunctionwillexecutesimmediately})这个函数......
  • JavaWeb商城项目的商品点赞功能模块的开发详
    一.JavaWeb商城项目的商品点赞功能开发过程记录1.1项目背景在完成内蒙古科技大学JavaWeb课程的大作业之后,本着练习的态度继续的写了一个功能:点赞功能。本需求看似简单,难......
  • 【每天一个java设计模式(完)】 - 四万字实现23种设计模式(附示例源码)
    什么是设计模式:​​【每天一个java设计模式(零)】-设计模式基本概念及七大设计原则​​创建型模式工厂模式:​​【每天一个java设计模式(一)】-工厂模式​​抽象工厂模式:......