本文主要试用一下JDK12新引入的ShenandoahGC

ShenandoahGC

Shenandoah是一款concurrent及parallel的垃圾收集器

  • 跟ZGC一样也是面向low-pause-time的垃圾收集器,不过ZGC是基于colored pointers来实现,而Shenandoah GC是基于brooks pointers来实现
  • 与G1 GC相比,G1的evacuation是parallel的但不是concurrent,而Shenandoah的evacuation是concurrent,因而能更好地减少pause time
  • 与G1 GC一样,ShenandoahGC也是基于region的GC,不同的是ShenandoahGC在逻辑上没有分代,因而就没有young/old

GC cycle

ShenandoahGC主要有如下几个阶段:

Snapshot-at-the-beginning concurrent mark

这里包含Init Mark(Pause)、Concurrent Mark、Final Mark(Pause);这里使用到了White(not yet visited)、Gray(visited, but references are not scanned yet)、Black(visited, and fully scanned) Color算法进行mark

Concurrent evacuation

这个就是与G1不同的evacuation阶段,它是concurrent的;这里用到了Brooks Pointers(object version change with additional atomically changed indirection)算法进行copy,

Concurrent update references (optional)

这里包含Init update Refs(Pause)、Concurrent update Refs、Final update Refs(Pause)
Final Mark或者Final update Refs之后都可能进行Concurrent cleanup,进行垃圾回收,reclaims region

相关参数

Shenandoah开头的参数

     bool ShenandoahAcmpBarrier                    = true                                   {diagnostic} {default}bool ShenandoahAllocFailureALot               = false                                  {diagnostic} {default}uintx ShenandoahAllocSpikeFactor               = 5                                    {experimental} {default}intx ShenandoahAllocationStallThreshold       = 10000                                  {diagnostic} {default}uintx ShenandoahAllocationThreshold            = 0                                    {experimental} {default}bool ShenandoahAllocationTrace                = false                                  {diagnostic} {default}bool ShenandoahAllowMixedAllocs               = true                                   {diagnostic} {default}bool ShenandoahAlwaysClearSoftRefs            = false                                {experimental} {default}bool ShenandoahAlwaysPreTouch                 = false                                  {diagnostic} {default}bool ShenandoahCASBarrier                     = true                                   {diagnostic} {default}bool ShenandoahCloneBarrier                   = true                                   {diagnostic} {default}uintx ShenandoahCodeRootsStyle                 = 2                                    {experimental} {default}bool ShenandoahCommonGCStateLoads             = false                                {experimental} {default}bool ShenandoahConcurrentScanCodeRoots        = true                                 {experimental} {default}uintx ShenandoahControlIntervalAdjustPeriod    = 1000                                 {experimental} {default}uintx ShenandoahControlIntervalMax             = 10                                   {experimental} {default}uintx ShenandoahControlIntervalMin             = 1                                    {experimental} {default}uintx ShenandoahCriticalFreeThreshold          = 1                                    {experimental} {default}bool ShenandoahDecreaseRegisterPressure       = false                                  {diagnostic} {default}bool ShenandoahDegeneratedGC                  = true                                   {diagnostic} {default}bool ShenandoahDontIncreaseWBFreq             = true                                 {experimental} {default}bool ShenandoahElasticTLAB                    = true                                   {diagnostic} {default}uintx ShenandoahEvacAssist                     = 10                                   {experimental} {default}uintx ShenandoahEvacReserve                    = 5                                    {experimental} {default}bool ShenandoahEvacReserveOverflow            = true                                 {experimental} {default}double ShenandoahEvacWaste                      = 1.200000                             {experimental} {default}uintx ShenandoahFreeThreshold                  = 10                                   {experimental} {default}uintx ShenandoahFullGCThreshold                = 3                                    {experimental} {default}ccstr ShenandoahGCHeuristics                   = adaptive                             {experimental} {default}uintx ShenandoahGarbageThreshold               = 60                                   {experimental} {default}uintx ShenandoahGuaranteedGCInterval           = 300000                               {experimental} {default}size_t ShenandoahHeapRegionSize                 = 0                                    {experimental} {default}bool ShenandoahHumongousMoves                 = true                                 {experimental} {default}intx ShenandoahHumongousThreshold             = 100                                  {experimental} {default}uintx ShenandoahImmediateThreshold             = 90                                   {experimental} {default}bool ShenandoahImplicitGCInvokesConcurrent    = true                                 {experimental} {default}uintx ShenandoahInitFreeThreshold              = 70                                   {experimental} {default}bool ShenandoahKeepAliveBarrier               = true                                   {diagnostic} {default}uintx ShenandoahLearningSteps                  = 5                                    {experimental} {default}bool ShenandoahLoopOptsAfterExpansion         = true                                 {experimental} {default}uintx ShenandoahMarkLoopStride                 = 1000                                 {experimental} {default}intx ShenandoahMarkScanPrefetch               = 32                                   {experimental} {default}size_t ShenandoahMaxRegionSize                  = 33554432                             {experimental} {default}uintx ShenandoahMergeUpdateRefsMaxGap          = 200                                  {experimental} {default}uintx ShenandoahMergeUpdateRefsMinGap          = 100                                  {experimental} {default}uintx ShenandoahMinFreeThreshold               = 10                                   {experimental} {default}size_t ShenandoahMinRegionSize                  = 262144                               {experimental} {default}bool ShenandoahOOMDuringEvacALot              = false                                  {diagnostic} {default}bool ShenandoahOptimizeInstanceFinals         = false                                {experimental} {default}bool ShenandoahOptimizeStableFinals           = false                                {experimental} {default}bool ShenandoahOptimizeStaticFinals           = true                                 {experimental} {default}bool ShenandoahPacing                         = true                                 {experimental} {default}uintx ShenandoahPacingCycleSlack               = 10                                   {experimental} {default}uintx ShenandoahPacingIdleSlack                = 2                                    {experimental} {default}uintx ShenandoahPacingMaxDelay                 = 10                                   {experimental} {default}double ShenandoahPacingSurcharge                = 1.100000                             {experimental} {default}uintx ShenandoahParallelRegionStride           = 1024                                 {experimental} {default}uint ShenandoahParallelSafepointThreads       = 4                                    {experimental} {default}bool ShenandoahPreclean                       = true                                 {experimental} {default}bool ShenandoahReadBarrier                    = true                                   {diagnostic} {default}uintx ShenandoahRefProcFrequency               = 5                                    {experimental} {default}bool ShenandoahRegionSampling                 = true                                 {experimental} {command line}int ShenandoahRegionSamplingRate             = 40                                   {experimental} {default}bool ShenandoahSATBBarrier                    = true                                   {diagnostic} {default}uintx ShenandoahSATBBufferFlushInterval        = 100                                  {experimental} {default}size_t ShenandoahSATBBufferSize                 = 1024                                 {experimental} {default}bool ShenandoahStoreCheck                     = false                                  {diagnostic} {default}bool ShenandoahStoreValEnqueueBarrier         = false                                  {diagnostic} {default}bool ShenandoahStoreValReadBarrier            = true                                   {diagnostic} {default}bool ShenandoahSuspendibleWorkers             = false                                {experimental} {default}size_t ShenandoahTargetNumRegions               = 2048                                 {experimental} {default}bool ShenandoahTerminationTrace               = false                                  {diagnostic} {default}bool ShenandoahUncommit                       = true                                 {experimental} {default}uintx ShenandoahUncommitDelay                  = 300000                               {experimental} {default}uintx ShenandoahUnloadClassesFrequency         = 0                                    {experimental} {default}ccstr ShenandoahUpdateRefsEarly                = adaptive                             {experimental} {default}bool ShenandoahVerify                         = false                                  {diagnostic} {default}intx ShenandoahVerifyLevel                    = 4                                      {diagnostic} {default}bool ShenandoahWriteBarrier                   = true                                   {diagnostic} {default}

其中有一些是diagnostic用的,比如ShenandoahAcmpBarrier、ShenandoahAllocFailureALot、ShenandoahAllocationStallThreshold等

Heuristics相关参数

    ccstr ShenandoahGCHeuristics                   = adaptive                             {experimental} {default}uintx ShenandoahInitFreeThreshold              = 70                                   {experimental} {default}uintx ShenandoahMinFreeThreshold               = 10                                   {experimental} {default}uintx ShenandoahAllocSpikeFactor               = 5                                    {experimental} {default}uintx ShenandoahGarbageThreshold               = 60                                   {experimental} {default}uintx ShenandoahFreeThreshold                  = 10                                   {experimental} {default}uintx ShenandoahAllocationThreshold            = 0                                    {experimental} {default}ccstr ShenandoahUpdateRefsEarly                = adaptive                             {experimental} {default}

Heuristics主要用于告诉Shenandoah何时启动一个GC cycle,其中ShenandoahGCHeuristics用于选择不同的策略,其可选值有adaptive(默认)、static、compact、passive(diagnostic用)、aggressive(diagnostic用)

  • adaptive方式主要通过ShenandoahInitFreeThreshold(Initial remaining free heap threshold for learning steps)、ShenandoahMinFreeThreshold(free space threshold at which heuristics triggers the GC unconditionally)、ShenandoahAllocSpikeFactor(How much heap to reserve for absorbing allocation spikes)、XX:ShenandoahGarbageThreshold(Sets the percentage of garbage a region need to contain before it can be marked for collection)来设置合适启动GC cycle
  • static方式主要是基于heap occupancy以及allocation pressure来决定是否启动GC cycle,相关参数有:ShenandoahFreeThreshold(Set the percentage of free heap at which a GC cycle is started)、ShenandoahAllocationThreshold(Set percentage of memory allocated since last GC cycle before a new GC cycle is started)、ShenandoahGarbageThreshold
  • compact方式是continuous方式的,只要有allocation发生,上一个GC cycle结束之后就启动新的GC cycle,相关参数有ConcGCThreads(Trim down the number of concurrent GC threads to make more room for application to run)、ShenandoahAllocationThreshold
  • passive方式是完全passive,当内存耗尽时触发STW,通常用于diagnostic
  • aggressive方式是完全active的,上一个GC cycle结束之后就启动新的GC cycle(有点类似compact方式),不过它会evacuate所有的live objects,通常用于diagnostic

Failure Modes

当allocation failure发生的时候,Shenandoah有一些优雅的degradation ladder用于处理这种情况,如下:

  • Pacing(<10 ms)

ShenandoahPacing参数默认开启,Pacer用于在gc不够快的时候去stall正在分配对象的线程,当gc速度跟上来了就解除对这些线程的stall;stall不是无期限的,有个ShenandoahPacingMaxDelay(单位毫秒)参数可以设置,一旦超过该值allocation就会产生。当allocation压力大的时候,Pacer就无能为力了,这个时候就会进入下一个step

  • Degenerated GC(<100 ms)

ShenandoahDegeneratedGC参数默认开启,在这个Degenerated cycle,Shenandoah使用的线程数取之于ParallelGCThreads而非ConcCGThreads

  • Full GC(>100 ms)

当Degenerated GC之后还没有足够的内存,则进入Full GC cycle,它会尽可能地进行compact然后释放内存以确保不发生OOM

实例

启动参数

-server -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UsePerfData -XX:+ShenandoahRegionSampling -XX:ParallelGCThreads=4 -XX:ConcGCThreads=4 -XX:+UnlockDiagnosticVMOptions -Xlog:age*,ergo*,gc*=info

gc日志

[2019-03-21T15:12:53.771-0800][8707][gc] Consider -XX:+ClassUnloadingWithConcurrentMark if large pause times are observed on class-unloading sensitive workloads
[2019-03-21T15:12:53.862-0800][8707][gc,init] Regions: 2048 x 1024K
[2019-03-21T15:12:53.862-0800][8707][gc,init] Humongous object threshold: 1024K
[2019-03-21T15:12:53.863-0800][8707][gc,init] Max TLAB size: 1024K
[2019-03-21T15:12:53.863-0800][8707][gc,init] GC threads: 4 parallel, 4 concurrent
[2019-03-21T15:12:53.863-0800][8707][gc,init] Reference processing: parallel
[2019-03-21T15:12:53.864-0800][8707][gc     ] Heuristics ergonomically sets -XX:+ExplicitGCInvokesConcurrent
[2019-03-21T15:12:53.864-0800][8707][gc     ] Heuristics ergonomically sets -XX:+ShenandoahImplicitGCInvokesConcurrent
[2019-03-21T15:12:53.864-0800][8707][gc,init] Shenandoah heuristics: adaptive
[2019-03-21T15:12:53.864-0800][8707][gc,heap] Initialize Shenandoah heap with initial size 128M
[2019-03-21T15:12:53.865-0800][8707][gc,ergo] Pacer for Idle. Initial: 40M, Alloc Tax Rate: 1.0x
[2019-03-21T15:12:53.883-0800][8707][gc,init] Safepointing mechanism: global-page poll
[2019-03-21T15:12:53.883-0800][8707][gc     ] Using Shenandoah
[2019-03-21T15:12:53.884-0800][8707][gc,heap,coops] Heap address: 0x0000000780000000, size: 2048 MB, Compressed Oops mode: Zero based, Oop shift amount: 3
[2019-03-21T15:12:59.530-0800][14083][gc           ] Trigger: Metadata GC Threshold
[2019-03-21T15:12:59.532-0800][14083][gc,ergo      ] Free: 1813M (1813 regions), Max regular: 1024K, Max humongous: 1855488K, External frag: 1%, Internal frag: 0%
[2019-03-21T15:12:59.532-0800][14083][gc,ergo      ] Evacuation Reserve: 103M (103 regions), Max regular: 1024K
[2019-03-21T15:12:59.532-0800][14083][gc,start     ] GC(0) Concurrent reset
[2019-03-21T15:12:59.533-0800][14083][gc,task      ] GC(0) Using 4 of 4 workers for concurrent reset
[2019-03-21T15:12:59.533-0800][14083][gc           ] GC(0) Concurrent reset 132M->132M(2048M) 0.441ms
[2019-03-21T15:12:59.533-0800][15619][gc,start     ] GC(0) Pause Init Mark (process weakrefs) (unload classes)
[2019-03-21T15:12:59.533-0800][15619][gc,task      ] GC(0) Using 4 of 4 workers for init marking
[2019-03-21T15:12:59.541-0800][15619][gc,ergo      ] GC(0) Pacer for Mark. Expected Live: 204M, Free: 1813M, Non-Taxable: 181M, Alloc Tax Rate: 0.4x
[2019-03-21T15:12:59.541-0800][15619][gc           ] GC(0) Pause Init Mark (process weakrefs) (unload classes) 7.568ms
[2019-03-21T15:12:59.541-0800][14083][gc,start     ] GC(0) Concurrent marking (process weakrefs) (unload classes)
[2019-03-21T15:12:59.541-0800][14083][gc,task      ] GC(0) Using 4 of 4 workers for concurrent marking
[2019-03-21T15:12:59.619-0800][14083][gc           ] GC(0) Concurrent marking (process weakrefs) (unload classes) 132M->134M(2048M) 78.373ms
[2019-03-21T15:12:59.619-0800][14083][gc,start     ] GC(0) Concurrent precleaning
[2019-03-21T15:12:59.619-0800][14083][gc,task      ] GC(0) Using 1 of 4 workers for concurrent preclean
[2019-03-21T15:12:59.622-0800][14083][gc           ] GC(0) Concurrent precleaning 134M->134M(2048M) 2.397ms
[2019-03-21T15:12:59.622-0800][15619][gc,start     ] GC(0) Pause Final Mark (process weakrefs) (unload classes)
[2019-03-21T15:12:59.622-0800][15619][gc,task      ] GC(0) Using 4 of 4 workers for final marking
[2019-03-21T15:12:59.625-0800][15619][gc,stringtable] GC(0) Cleaned string table, strings: 13692 processed, 50 removed
[2019-03-21T15:12:59.626-0800][15619][gc,ergo       ] GC(0) Adaptive CSet Selection. Target Free: 204M, Actual Free: 1914M, Max CSet: 85M, Min Garbage: 0M
[2019-03-21T15:12:59.626-0800][15619][gc,ergo       ] GC(0) Collectable Garbage: 117M (97% of total), 8M CSet, 126 CSet regions
[2019-03-21T15:12:59.626-0800][15619][gc,ergo       ] GC(0) Immediate Garbage: 0M (0% of total), 0 regions
[2019-03-21T15:12:59.626-0800][15619][gc,ergo       ] GC(0) Pacer for Evacuation. Used CSet: 126M, Free: 1811M, Non-Taxable: 181M, Alloc Tax Rate: 1.1x
[2019-03-21T15:12:59.626-0800][15619][gc            ] GC(0) Pause Final Mark (process weakrefs) (unload classes) 4.712ms
[2019-03-21T15:12:59.626-0800][14083][gc,start      ] GC(0) Concurrent cleanup
[2019-03-21T15:12:59.627-0800][14083][gc            ] GC(0) Concurrent cleanup 134M->135M(2048M) 0.132ms
[2019-03-21T15:12:59.627-0800][14083][gc,ergo       ] GC(0) Free: 1810M (1810 regions), Max regular: 1024K, Max humongous: 1852416K, External frag: 1%, Internal frag: 0%
[2019-03-21T15:12:59.627-0800][14083][gc,ergo       ] GC(0) Evacuation Reserve: 102M (103 regions), Max regular: 1024K
[2019-03-21T15:12:59.627-0800][14083][gc,start      ] GC(0) Concurrent evacuation
[2019-03-21T15:12:59.627-0800][14083][gc,task       ] GC(0) Using 4 of 4 workers for concurrent evacuation
[2019-03-21T15:12:59.643-0800][14083][gc            ] GC(0) Concurrent evacuation 135M->145M(2048M) 15.912ms
[2019-03-21T15:12:59.643-0800][15619][gc,start      ] GC(0) Pause Init Update Refs
[2019-03-21T15:12:59.643-0800][15619][gc,ergo       ] GC(0) Pacer for Update Refs. Used: 145M, Free: 1810M, Non-Taxable: 181M, Alloc Tax Rate: 1.1x
[2019-03-21T15:12:59.643-0800][15619][gc            ] GC(0) Pause Init Update Refs 0.090ms
[2019-03-21T15:12:59.643-0800][14083][gc,start      ] GC(0) Concurrent update references
[2019-03-21T15:12:59.643-0800][14083][gc,task       ] GC(0) Using 4 of 4 workers for concurrent reference update
[2019-03-21T15:12:59.652-0800][14083][gc            ] GC(0) Concurrent update references 145M->147M(2048M) 9.028ms
[2019-03-21T15:12:59.652-0800][15619][gc,start      ] GC(0) Pause Final Update Refs
[2019-03-21T15:12:59.652-0800][15619][gc,task       ] GC(0) Using 4 of 4 workers for final reference update
[2019-03-21T15:12:59.653-0800][15619][gc            ] GC(0) Pause Final Update Refs 0.489ms
[2019-03-21T15:12:59.653-0800][14083][gc,start      ] GC(0) Concurrent cleanup
[2019-03-21T15:12:59.653-0800][14083][gc            ] GC(0) Concurrent cleanup 147M->21M(2048M) 0.088ms
[2019-03-21T15:12:59.653-0800][14083][gc,ergo       ] Free: 1924M (1924 regions), Max regular: 1024K, Max humongous: 1840128K, External frag: 7%, Internal frag: 0%
[2019-03-21T15:12:59.653-0800][14083][gc,ergo       ] Evacuation Reserve: 103M (103 regions), Max regular: 1024K
[2019-03-21T15:12:59.653-0800][14083][gc,ergo       ] Pacer for Idle. Initial: 40M, Alloc Tax Rate: 1.0x
[2019-03-21T15:17:59.666-0800][14083][gc            ] Trigger: Time since last GC (300009 ms) is larger than guaranteed interval (300000 ms)

gc visualizer

有个shenandoah-visualizer工具可以用来可视化ShenandoahGC,可视化效果如下:

小结

  • Shenandoah是一款concurrent及parallel的垃圾收集器;跟ZGC一样也是面向low-pause-time的垃圾收集器,不过ZGC是基于colored pointers来实现,而Shenandoah GC是基于brooks pointers来实现;与G1 GC相比,G1的evacuation是parallel的但不是concurrent,而Shenandoah的evacuation是concurrent,因而能更好地减少pause time;与G1 GC一样,ShenandoahGC也是基于region的GC,不同的是ShenandoahGC在逻辑上没有分代,因而就没有young/old
  • Shenandoah的GC cycle主要有Snapshot-at-the-beginning concurrent mark包括Init Mark(Pause)、Concurrent Mark、Final Mark(Pause)、Concurrent evacuation、Concurrent update references (optional)包括Init update Refs(Pause)、Concurrent update Refs、Final update Refs(Pause);其中Final Mark或者Final update Refs之后都可能进行Concurrent cleanup,进行垃圾回收,reclaims region
  • Heuristics主要用于告诉Shenandoah何时启动一个GC,其中ShenandoahGCHeuristics用于选择不同的策略,其可选值有adaptive(默认)、static、compact、passive(diagnostic用)、aggressive(diagnostic用);另外当allocation failure发生的时候,Shenandoah有一些优雅的degradation ladder用于处理这种情况,包括Pacing(<10 ms)、Degenerated GC(<100 ms)、Full GC(>100 ms)

doc

  • Shenandoah GC
  • JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
  • Changes to Garbage Collection in Java 12
  • 9 Garbage-First Garbage Collector
  • G1GC – Java 9 Garbage Collector explained in 5 minutes
  • devoxx-Nov2017-shenandoah(部分图片来源于此pdf)

作者:go4it
链接:https://www.jianshu.com/p/e40f5570417b
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

JDK12 ShenandoahGC小试牛刀相关推荐

  1. (八)JVM成神路之GC分区篇:G1、ZGC、ShenandoahGC高性能收集器深入剖析

    引言 在<GC分代篇>中,我们曾对JVM中的分代GC收集器进行了全面阐述,而在本章中重点则是对JDK后续新版本中研发推出的高性能收集器进行深入剖析,但在开始前,先来看看JDK的发布记录中关 ...

  2. jdk12‘javac‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

    前言: 安装JDK12遇到的问题以及学习过程, 我第一次用网上的安装办法,下载EXE后,配置好三个环境变量后运行,不行. 解决过程: 问题1:安装后javac命令运行时报错 jdk12'javac' ...

  3. Node.js开发WEB项目后端接口API,基于mysql5.7数据库(小试牛刀)

    项目结构 main.js(入口文件,开启9999端口监听,实现RESTful风格接口访问) const express = require("express"); const ap ...

  4. Java12和Jdk12安装以及OpenJdk12源码

    文档: JDK 12文档:https://docs.oracle.com/en/java/javase/12/ 下载: OracleJDK12下载:https://www.oracle.com/tec ...

  5. mongoose小试牛刀

    参考: Mongoose Networking Library Documentation 正文: 先展示一下小试牛刀的结果吧- 一. 首先在程序默认指定的端口上开启服务,在后台运行 ./http_c ...

  6. jdk-12.0.2 64位最新版

    教程: 1.下载并且解压安装包,双击jdk-12.0.2_windows-x64_bin.exe并选择以管理员身份运行. 2.出现安装界面一直点击下一步,到安装目录文件位置,可自行更改文件安装路径,但 ...

  7. CSS学习18之小试牛刀

    小试牛刀 到现在为止,我们已经将css要学习的初级中级高级知识都已经学完了,接下来我们就应该对自己做一个小测验了,以下就是我的小测验,模拟qq会员官网的头部栏! 素材 bg.png背景图 logo.p ...

  8. Android开发之Retrofit小试牛刀

    感觉好久没有写Android的文章了,囧囧囧!因为Retrofit实在是太火了, 火得我一直跃跃欲试,但是由于种种原因吧,一直都没有用过.周末闲来无事,利用一个以前开发中用过的服务器API来小试牛刀一 ...

  9. MongoDB 小试牛刀

    MongoDb是不错的NoSQL数据库之一,NoSQL 的意思是Not Only SQL,比关系型数据库MySQL.SQL Server等更易于扩展,更多的应用于海量数据的存储,且数据可以弹性跨LAN ...

最新文章

  1. (转)浅谈HTML5与css3画饼图!
  2. (chap6 Http首部) 通用首部字段 Connection
  3. 深度学习——卷积神经网络 的经典网络(LeNet-5、AlexNet、ZFNet、VGG-16、GoogLeNet、ResNet)
  4. mysql远程访问时间长无反应_远程MySQL访问需要很长时间
  5. java 双向链表_23张图!万字详解「链表」,从小白到大佬
  6. 2114. 句子中的最多单词数
  7. 如何手动从Exchange2007/1010边缘/集线器传输服务器卸载ScanMail for Exchange(SMEX10.0)程序...
  8. 基于MyEclipse+Mysql+Tomcat+SSH开发的运动会管理系统
  9. 测试职业发展前景之职业发展方向
  10. Codecademy-网站编程开发学习网站
  11. ROS2进阶:安装与初体验(附choco介绍)
  12. 读懂python代码_【坚持】Selenium+Python学习之从读懂代码开始 DAY6
  13. 逻辑运算符 异或是什么意思 异或运算
  14. 关于UEdit在编辑时老是弹窗提示UEdit已启用
  15. NAO机器人——运动控制(3)
  16. hbase之布隆过滤器
  17. 【最新计算机、电子毕业设计 本科 大专 设计+源码】
  18. Odoo14免费开源ERP:企业客户档案信息自动补全功能演示
  19. 计算机cad相关证书,cad证书含金量 工资一般是多少
  20. python decimal 转换为float_在Python中将float转换为decimal类型

热门文章

  1. ref,reactive toRaw
  2. VisualVM 启动报错Error Starting VisualVM:You are running VisualVM using Java Runtime Environment(JRE)
  3. 安装惠普打印机显示等待php,安装惠普打印机出现“新设备现已连接”一直不动怎么办?...
  4. 在docker下进行ETH并行训练和在本机下进行ETH并行训练
  5. Windows 源码编译 nginx (加入nginx-http-flv-module)
  6. 命令行提示符参数PS1, 但是不会自动换行
  7. 求解矩阵A的满秩分解的一般方法
  8. 神经网络方法研究及应用,基于神经网络的控制
  9. 【仿真】羽毛球空气动力学运动方程分析
  10. 机器视觉-工业相机篇