iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >jvm的SystemGC原理是什么
  • 473
分享到

jvm的SystemGC原理是什么

2023-06-28 23:06:29 473人浏览 薄情痞子
摘要

这篇文章主要介绍了JVM的SystemGC原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇jvm的SystemGC原理是什么文章都会有所收获,下面我们一起来看看吧。概述JVM的GC一般情况下是JVM本身

这篇文章主要介绍了JVM的SystemGC原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇jvm的SystemGC原理是什么文章都会有所收获,下面我们一起来看看吧。

概述

JVM的GC一般情况下是JVM本身根据一定的条件触发的,不过我们还是可以做一些人为的触发,比如通过jvmti做强制GC,通过System.gc触发,还可以通过jmap来触发等。

或许大家已经知道如下相关的知识

  • system.gc其实是做一次full gc

  • system.gc会暂停整个进程

  • system.gc一般情况下我们要禁掉,使用-XX:+DisableExplicitGC

  • system.gc在cms gc下我们通过-XX:+ExplicitGCInvokesConcurrent来做一次稍微高效点的GC(效果比Full GC要好些)

  • system.gc最常见的场景是RMI/NIO下的堆外内存分配等

如果你已经知道上面这些了其实也说明你对System.gc有过一定的了解,至少踩过一些坑,但是你是否更深层次地了解过它,比如

  • 为什么CMS GC下-XX:+ExplicitGCInvokesConcurrent这个参数加了之后会比真正的Full GC好?

  • 它如何做到暂停整个进程?

  • 堆外内存分配为什么有时候要配合System.gc?

如果你上面这些疑惑也都知道,那说明你很懂System.gc了,那么接下来的文字你可以不用看啦

jdk里的System.gc的实现

先贴段代码吧(java.lang.System)

public static void gc() {    Runtime.getRuntime().gc();}

发现主要调用的是Runtime里的gc方法(java.lang.Runtime)

public native void gc();

这里看到gc方法是native的,在java层面只能到此结束了,代码只有这么多,要了解更多,可以看方法上面的注释,不过我们需要更深层次地来了解其实现,那还是准备好进入到jvm里去看看

Hotspot里System.gc的实现

如何找到native里的实现

上面提到了Runtime.gc是一个本地方法,那需要先在jvm里找到对应的实现,这里稍微提一下jvm里native方法最常见的也是最简单的查找,jdk里一般含有native方法的类,一般都会有一个对应的c文件,比如上面的java.lang.Runtime这个类,会有一个Runtime.c的文件和它对应,native方法的具体实现都在里面了,如果你有source,可能会猜到和下面的方法对应

JNIEXPORT void JNICALLJava_java_lang_Runtime_gc(JNIEnv *env, jobject this){    JVM_GC();}

其实没错的,就是这个方法,jvm要查找到这个native方法其实很简单的,看方法名可能也猜到规则了,Java_pkgName_className_methodName,其中pkgName里的".“替换成”_“,这样就能找到了,当然规则不仅仅只有这么一个,还有其他的,这里不细说了,有机会写篇文章详细介绍下其中细节

DisableExplicitGC参数

上面的方法里是调用JVM_GC(),实现如下

JVM_ENTRY_NO_ENV(void, JVM_GC(void))  JVMWrapper("JVM_GC");  if (!DisableExplicitGC) {    Universe::heap()->collect(GCCause::_java_lang_system_gc);  }JVM_END

看到这里我们已经解释其中一个疑惑了,就是DisableExplicitGC这个参数是在哪里生效的,起的什么作用,如果这个参数设置为true的话,那么将直接跳过下面的逻辑,我们通过-XX:+ DisableExplicitGC就是将这个属性设置为true,而这个属性默认情况下是true还是false呢

product(bool, DisableExplicitGC, false,                                             "Tells whether calling System.gc() does a full GC")

ExplicitGCInvokesConcurrent参数

这里主要针对CMSGC下来做分析,所以我们上面看到调用了heap的collect方法,我们找到对应的逻辑

void GenCollectedHeap::collect(GCCause::Cause cause) {  if (should_do_concurrent_full_gc(cause)) {#ifndef SERIALGC    // mostly concurrent full collection    collect_mostly_concurrent(cause);#else  // SERIALGC    ShouldNotReachHere();#endif // SERIALGC  } else {#ifdef ASSERT    if (cause == GCCause::_scavenge_alot) {      // minor collection only      collect(cause, 0);    } else {      // Stop-the-world full collection      collect(cause, n_gens() - 1);    }#else    // Stop-the-world full collection    collect(cause, n_gens() - 1);#endif  }}bool GenCollectedHeap::should_do_concurrent_full_gc(GCCause::Cause cause) {  return UseConcMarkSweepGC &&         ((cause == GCCause::_gc_locker && GCLockerInvokesConcurrent) ||          (cause == GCCause::_java_lang_system_gc && ExplicitGCInvokesConcurrent));}

collect里一开头就有个判断,如果should_do_concurrent_full_gc返回true,那会执行collect_mostly_concurrent做并行的回收

其中should_do_concurrent_full_gc中的逻辑是如果使用CMS GC,并且是system gc且ExplicitGCInvokesConcurrent==true,那就做并行full gc,当我们设置-XX:+ ExplicitGCInvokesConcurrent的时候,就意味着应该做并行Full GC了,不过要注意千万不要设置-XX:+DisableExplicitGC,不然走不到这个逻辑里来了

并行Full GC相对正常的Full GC效率高在哪里

stop the world

说到GC,这里要先提到VMThread,在jvm里有这么一个线程不断轮询它的队列,这个队列里主要是存一些VM_operation的动作,比如最常见的就是内存分配失败要求做GC操作的请求等,在对gc这些操作执行的时候会先将其他业务线程都进入到安全点,也就是这些线程从此不再执行任何字节码指令,只有当出了安全点的时候才让他们继续执行原来的指令,因此这其实就是我们说的stop the world(STW),整个进程相当于静止了

CMS GC

这里必须提到CMS GC,因为这是解释并行Full GC和正常Full GC的关键所在,CMS GC我们分为两种模式background和foreground,其中background顾名思义是在后台做的,也就是可以不影响正常的业务线程跑,触发条件比如说old的内存占比超过多少的时候就可能触发一次background式的cms gc,这个过程会经历CMS GC的所有阶段,该暂停的暂停,该并行的并行,效率相对来说还比较高,毕竟有和业务线程并行的gc阶段;而foreground则不然,它发生的场景比如业务线程请求分配内存,但是内存不够了,于是可能触发一次cms gc,这个过程就必须是要等内存分配到了线程才能继续往下面走的,因此整个过程必须是STW的,因此CMS GC整个过程都是暂停应用的,但是为了提高效率,它并不是每个阶段都会走的,只走其中一些阶段,这些省下来的阶段主要是并行阶段,Precleaning、AbortablePreclean,Resizing这几个阶段都不会经历,其中sweep阶段是同步的,但不管怎么说如果走了类似foreground的cms gc,那么整个过程业务线程都是不可用的,效率会影响挺大。CMS GC具体的过程后面再写文章详细说,其过程确实非常复杂的

正常的Full GC

正常的Full GC其实是整个gc过程包括ygc和cms gc(这里说的是真正意义上的Full GC,还有些场景虽然调用Full GC的接口,但是并不会都做,有些时候只做ygc,有些时候只做cms gc)都是由VMThread来执行的,因此整个时间是ygc+cms gc的时间之和,其中CMS GC是上面提到的foreground式的,因此整个过程会比较长,也是我们要避免的

并行的Full GC

并行Full GC也通样会做YGC和CMS GC,但是效率高就搞在CMS GC是走的background的,整个暂停的过程主要是YGC+CMS_initMark+CMS_remark几个阶段

堆外内存常配合使用System GC

这里说的堆外内存主要针对java.nio.DirectByteBuffer,这些对象的创建过程会通过Unsafe接口直接通过os::malloc来分配内存,然后将内存的起始地址和大小存到java.nio.DirectByteBuffer对象里,这样就可以直接操作这些内存。这些内存只有在DirectByteBuffer回收掉之后才有机会被回收,因此如果这些对象大部分都移到了old,但是一直没有触发CMS GC或者Full GC,那么悲剧将会发生,因为你的物理内存被他们耗尽了,因此为了避免这种悲剧的发生,通过-XX:MaxDirectMemorySize来指定最大的堆外内存大小,当使用达到了阈值的时候将调用System.gc来做一次full gc,以此来回收掉没有被使用的堆外内存。

关于“jvm的SystemGC原理是什么”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“jvm的SystemGC原理是什么”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: jvm的SystemGC原理是什么

本文链接: https://www.lsjlt.com/news/321303.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • jvm的SystemGC原理是什么
    这篇文章主要介绍了jvm的SystemGC原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇jvm的SystemGC原理是什么文章都会有所收获,下面我们一起来看看吧。概述JVM的GC一般情况下是JVM本身...
    99+
    2023-06-28
  • jvm原理之SystemGC源码分析
    概述 JVM的GC一般情况下是JVM本身根据一定的条件触发的,不过我们还是可以做一些人为的触发,比如通过jvmti做强制GC,通过System.gc触发,还可以通过jmap来触发等,...
    99+
    2024-04-02
  • JAVA和JVM运行原理是什么
    一、Java运行原理 (1)源码编写:Java源代码是由开发人员使用Java语言编写的,它是按照Java的语法规则进行编写的文本文件,一般以“、java”为文件扩展名。 (2)源码编译:Java源代码通过Java编译器进行编译,...
    99+
    2023-10-29
    原理 JAVA JVM
  • JVM中Synchronized作用及原理是什么
    这篇文章主要介绍“JVM中Synchronized作用及原理是什么”,在日常操作中,相信很多人在JVM中Synchronized作用及原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JVM中Synch...
    99+
    2023-07-05
  • JVM工作原理和特点是什么
    本篇文章给大家分享的是有关JVM工作原理和特点是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。我们运行和调试Java程序的时候,经常会提到一个JVM的概念,这里向大家描述一...
    99+
    2023-06-17
  • java中虚拟机jvm原理是什么
    这篇文章将为大家详细讲解有关java中虚拟机jvm原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。曾几何时,我们还是初识Hello World的时候,我们哪曾知道,Java这门神奇的语言,在执行我...
    99+
    2023-06-25
  • JVM体系结构目的和原理是什么
    这篇文章将为大家详细讲解有关JVM体系结构目的和原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。JVM体系结构由五部分组成,分别是寄存器、栈、废区收集堆、存储区和指令集,这五部分是J...
    99+
    2023-06-17
  • jvm垃圾回收机制的原理是什么
    JVM(Java虚拟机)的垃圾回收机制是自动管理内存的一种机制,它通过识别和释放不再被程序使用的对象,以防止内存泄漏和内存溢出等问题...
    99+
    2023-09-25
    jvm
  • JVM内存区域划分的原理是什么
    JVM内存区域划分的原理是根据不同的用途和功能将JVM的内存划分为不同的区域,以便更有效地管理和利用内存资源。JVM内存区域主要分为...
    99+
    2023-08-11
    JVM
  • JVM Log技术原理及用法是什么
    本篇文章为大家展示了JVM Log技术原理及用法是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。介绍一下JVM Log的概念,初始化和释放,JVM Log各个class的实现除了很自然地运用了继...
    99+
    2023-06-17
  • JAVA和JVM运行原理分别是什么
    本篇文章为大家展示了JAVA和JVM运行原理分别是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。JAVA和JVM运行的原理Java语言写的源程序通过Java编译器,编译成与平台无关的&l...
    99+
    2023-06-17
  • JVM垃圾回收基本原理是什么
    这篇文章主要介绍“JVM垃圾回收基本原理是什么”,在日常操作中,相信很多人在JVM垃圾回收基本原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JVM垃圾回收基本原理是什么”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-02
  • JVM加载class文件的原理机制是什么
    今天小编给大家分享一下JVM加载class文件的原理机制是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、JVM简介J...
    99+
    2023-06-30
  • jvm原理及性能调优方法是什么
    JVM(Java Virtual Machine)是Java虚拟机的缩写,是Java程序运行的核心组件,负责将Java源代码编译成字...
    99+
    2024-04-02
  • JVM内存泄露的原因是什么
    本篇内容介绍了“JVM内存泄露的原因是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1 OOM的现象之一今天介绍第一种Java heap...
    99+
    2023-06-02
  • jvm垃圾回收GC调优基础原理是什么
    这篇文章主要介绍了jvm垃圾回收GC调优基础原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇jvm垃圾回收GC调优基础原理是什么文章都会有所收获,下面我们一起来看看吧。说明:Capacity: 性能,能...
    99+
    2023-06-29
  • JVM类加载机制过程以及原理是什么
    这篇文章主要介绍“JVM类加载机制过程以及原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JVM类加载机制过程以及原理是什么”文章能帮助大家解决问题。一、做一个小测试通过注释,标注出下面两个...
    99+
    2023-07-05
  • 什么是JVM
    一、什么是JVM Java虚拟机(JVM)是一个全面的信息处理和分析系统,是一个集成了各种Java技术和工具的系统平台,能够运行Java字节码,从而为Java程序提供一个运行环境。Java虚拟机通常包括类装载器、运行时数据区、执行引擎...
    99+
    2023-10-29
    JVM
  • 怎么分析JVM原理
    本篇文章为大家展示了怎么分析JVM原理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。什么是JVMJVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规...
    99+
    2023-06-02
  • JVM的含义是什么
    这篇文章主要介绍“JVM的含义是什么”,在日常操作中,相信很多人在JVM的含义是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JVM的含义是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!JVM是什...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作