Java GC 及HBase RegionServer GC调优

2023-11-07

1背景

1.1问题描述

HBase RegionServer由于GC等原因Stop World超过40s,RS在ZK上创建的临时节点被删除,造成Master认为RS已经下线,重新分配该RS上的Region。RS恢复后,由于种种原因(WAL被其它RSSplit并删除,Master通知RS下线等)只能主动退出。

经过长时间观察和参考网络资料,确定和HBase RS GC有关,需要调整GC参数以降低Full GC的频率。

 

1.2JVM GC简介

Java GC(Garbage Collection,垃圾收集,垃圾回收)机制主要负责3件事:1、确定哪些内存需要回收,2、确定什么时候需要执行GC,3、如何执行GC。该机制对 JVM(Java Virtual Machine)中的内存进行标记,并确定哪些内存需要回收。然后,根据一定的回收策略,自动的回收内存,永不停息(Nerver Stop)的保证JVM中的内存空间,防止出现内存泄露和溢出问题。

如JVM架构图,JAVA程序运行时的内存可以分为5个部分,这些模块的各自作用如下:程序计数器,每个线程有一个独立的程序计数器,记录下一条要运行的指令。如果执行的是JAVA方法,计数器记录正在执行的java字节码地址,如果执行的是native方法,则计数器为空;虚拟机栈 ,线程私有的,与线程在同一时间创建。管理JAVA方法执行的内存模型。每个方法执行时都会创建一个桢栈来存储方法的私有变量、操作数栈、动态链接方法、返回值、返回地址等信息。栈的大小决定了方法调用的可达深度(递归多少层次,或嵌套调用多少层,-Xss参数可以设置虚拟机栈大小)。栈的大小可以是固定的,或者是动态扩展的。如果栈的深度是固定的,请求的栈深度大于最大可用深度,则抛出StackOverflowError;如果栈是可动态扩展的,但没有内存空间支持扩展,则抛出OutOfMemoryError;本地方法区,和虚拟机栈功能相似,但管理的不是JAVA方法,是本地方法,本地方法是用C实现的;JAVA堆,线程共享的,存放所有对象实例和数组。垃圾回收的主要区域;方法区,线程共享的,用于存放被虚拟机加载的类的元数据信息:如常量、静态变量、即时编译器编译后的代码。也称为永久代。如果hotspot虚拟机确定一个类的定义信息不会被使用,也会将其回收。回收的基本条件至少有:所有该类的实例被回收,而且装载该类的ClassLoader被回收。

常见的GC策略有:标记-清除算法(Mark-Sweep),从根节点开始标记所有可达对象,其余没标记的即为垃圾对象,执行清除。但回收后的空间是不连续的;复制算法(copying),将内存分成两块,每次只使用其中一块,垃圾回收时,将标记的对象拷贝到另外一块中,然后完全清除原来使用的那块内存。复制后的空间是连续的。复制算法适用于新生代,因为垃圾对象多于存活对象,复制算法更高效;标记-压缩算法(Mark-compact),适合用于老年代的算法(存活对象多于垃圾对象)。标记后不复制,而是将存活对象压缩到内存的一端,然后清理边界外的所有对象。

 目前java中可作为GC Root的对象有:虚拟机栈中引用的对象(本地变量表);方法区中静态属性引用的对象;方法区中常量引用的对象;本地方法栈中引用的对象(Native对象)。

1.3分代GC

据IBM统计,98%对象瞬间消失,仅有2%对象存活较长时间。 HotSpot VM将堆分为Young generation和Old generation。大部分对象在Young generation创建,很快就不可达,发生在该区域的GC称为 "minor GC" 。Young generation 中存活下来的对象被拷贝(Promotion)到Old generation,该区GC频率较低,发生在该区的GC称为majorGC" (或"full GC") 。 

绝大多数刚创建的对象会被分配在Eden区,其中的大多数对象很快就会消亡。Eden区是连续的内存空间,因此在其上分配内存极快。Minor GC过程如下: 当Eden区满的时候,执行MinorGC,将消亡的对象清理掉,并将剩余的对象复制到一个存活区Survivor0(此时,Survivor1是空白的,两个Survivor总有一个是空白的); 此后,每次Eden区满了,就执行一次Minor GC,并将剩余的对象都添加到Survivor0;当Survivor0也满的时候,将其中仍然活着的对象直接复制到Survivor1,以后Eden区执行Minor GC后,就将剩余的对象添加Survivor1(此时,Survivor0是空白的)。 当两个存活区切换了几次(HotSpot虚拟机默认15次,用-XX:MaxTenuringThreshold控制,大于该值将对象提升到老年代)之后,仍然存活的对象,将被复制到老年代。

 年老代(Old Generation):对象如果在年轻代存活了足够长的时间而没有被清理掉(即在几次 Young GC后存活了下来),则会被复制到年老代,年老代的空间一般比年轻代大,能存放更多的对象,在年老代上发生的GC次数也比年轻代少。当年老代内存不足时, 将执行Major GC(或Full GC)。可以使用-XX:+UseAdaptiveSizePolicy开关来控制是否采用动态控制策略,如果动态控制,则动态调整Java堆中各个区域的大小以及进入老年代的年龄。如果对象比较大(比如长字符串或大数组),Young空间不足,则较大的对象会直接分配到老年代上。用-XX:PretenureSizeThreshold来控制直接升入老年代的对象大小,大于这个值的对象会直接分配在老年代上。

永久代的回收有两种:常量池中的常量,无用的类信息,常量的回收很简单,没有引用了就可以被回收。对于无用的类进行回收,必须保证3点:类的所有实例都已经被回收;加载类的ClassLoader已经被回收;类对象的Class对象没有被引用(即没有通过反射引用该类的地方)。

1.4常见GC策略

Serial收集器:新生代收集器,使用停止复制算法,使用一个线程进行GC,其它工作线程暂停。使用-XX:+UseSerialGC可以使用Serial+Serial Old模式运行进行内存回收(这也是虚拟机在Client模式下运行的默认值)

ParNew收集器:新生代收集器,使用停止复制算法,Serial收集器的多线程版,用多个线程进行GC,其它工作线程暂停,关注缩短垃圾收集时间。使用-XX:+UseParNewGC开关来控制使用ParNew+Serial Old收集器组合收集内存;使用-XX:ParallelGCThreads来设置执行内存回收的线程数。

ParallelScavenge 收集器:新生代收集器,使用停止复制算法,关注CPU吞吐量,即运行用户代码的时间/总时间,比如:JVM运行100分钟,其中运行用户代码99分钟,垃 圾收集1分钟,则吞吐量是99%,这种收集器能最高效率的利用CPU,适合运行后台运算(关注缩短垃圾收集时间的收集器,如CMS,等待时间很少,所以适合用户交互,提高用户体验)。使用-XX:+UseParallelGC开关控制使用 Parallel Scavenge+Serial Old收集器组合回收垃圾(这也是在Server模式下的默认值);使用-XX:GCTimeRatio来设置用户执行时间占总时间的比例,默认99,即 1%的时间用来进行垃圾回收。使用-XX:MaxGCPauseMillis设置GC的最大停顿时间(这个参数只对Parallel Scavenge有效)

 Serial Old收集器:老年代收集器,单线程收集器,使用标记整理(整理的方法是Sweep(清理)和Compact(压缩),清理是将废弃的对象干掉,只留幸存的对象,压缩是将移动对象,将空间填满保证内存分为2块,一块全是对象,一块空闲)算法,使用单线程进行GC,其它工作线程暂停(注意,在老年代中进行标 记整理算法清理,也需要暂停其它线程),在JDK1.5之前,Serial Old收集器与ParallelScavenge搭配使用。

Parallel Old收集器:老年代收集器,多线程,多线程机制与Parallel Scavenge差不错,使用标记整理(与Serial Old不同,这里的整理是Summary(汇总)和Compact(压缩),汇总的意思就是将幸存的对象复制到预先准备好的区域,而不是像Sweep(清 理)那样清理废弃的对象)算法,在Parallel Old执行时,仍然需要暂停其它线程。Parallel Old在多核计算中很有用。Parallel Old出现后(JDK 1.6),与Parallel Scavenge配合有很好的效果,充分体现Parallel Scavenge收集器吞吐量优先的效果。使用-XX:+UseParallelOldGC开关控制使用Parallel Scavenge +Parallel Old组合收集器进行收集。

CMS(Concurrent Mark Sweep)收集器:老年代收集器,致力于获取最短回收停顿时间,使用标记清除算法,多线程,优点是并发收集(用户线程可以和GC线程同时工作),停顿小。使用-XX:+UseConcMarkSweepGC进行ParNew+CMS+Serial Old进行内存回收,优先使用ParNew+CMS(原因见后面),当用户线程内存不足时,采用备用方案Serial Old收集。

G1收集器:JDK7开始支持,面向服务器的垃圾收集器,旨在取代CMS。

1.5CMS GC异常

对于采用CMS进行老年代GC的程序而言,尤其要注意GC日志中是否有promotion failed和concurrent mode failure两种状况,当这两种状况出现时可能会触发Serial Old GC (或Full GC)。

promotion failed:是在进行Minor GC时,survivor space放不下、对象只能放入老年代,而此时老年代也放不下造成的;

concurrent modefailure:是在执行CMS GC的过程中同时有对象要放入旧生代,而此时老年代空间不足造成的。

造成这些异常的原因主要有:老年代内存不足,需要提前进行CMS;老年代内存碎片化,需要进行压缩整理。

 

2GC调优实战

2.1常见JVM参数

JVM参数分为:标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用(但是,这些参数往往是非常有用的)。

非标准参数示例:

-Xms 为Heap区域的初始值,线上环境建议与-Xmx设置为一致

-Xmx 为Heap区域的最大值

-Xmn1024k,-Xmn512m,-Xmn1g(-Xms,-Xmx也是种写法)

对于非Stable参数,使用方法有4种:

    1. -XX:+<option> 启用选项

    2. -XX:-<option> 不启用选项

    3. -XX:<option>=<number> 给选项设置一个数字类型值,可跟单位,例如 32k,1024m, 2g

    4. -XX:<option>=<string> 给选项设置一个字符串值,例如-XX:HeapDumpPath=./dump.core

2.2看懂GC日志

JVM的GC日志的主要参数包括如下几个:

-XX:+PrintGC 输出GC日志

-XX:+PrintGCDetails 输出GC的详细日志

-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)

-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式, 2013-05-04T21:53:59.234+0800)

-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息

-Xloggc:../logs/gc.log 日志文件的输出路径

ParNew GC日志

[GC2016-03-25T02:35:26.074+0800:35289.315: [ParNew: 885174K->48101K(943744K), 0.0197790 secs]10343272K->9506199K(16672384K), 0.0199760 secs] [Times: user=0.27 sys=0.01,real=0.02 secs]

[GC时间: JVM启动时间: [类型: GC前年轻代大小A-> GC后年轻代大小B(年轻代总大小C), 耗时] GC前堆大小D->GC后堆大小E(堆的总大小F),GC总耗时] [Times: user=0.27 sys=0.01, real=0.02 secs]

B是GC后存活的对象大小,这里是不是需要分析一下MaxTenuringThreshold;F-C老年代堆大小;E-D此次GC释放内存大小;(E-D)-(B-A)年轻态提升到老年代的大小;(D-A)/(F-C)GC前老年代使用比例;(E-B)/(F-C)GC后老年代使用比。

CMS GC日志

2016-01-15T12:58:23.597+0800: 4215.939:[GC [1 CMS-initial-mark: 11025382K(15728640K)] 11130602K(16672384K), 0.0848720secs] [Times: user=0.0

3 sys=0.05, real=0.09 secs] 【1.初始标记,暂停JVM

2016-01-15T12:58:23.682+0800: 4216.024:[CMS-concurrent-mark-start]

2016-01-15T12:58:24.052+0800: 4216.393:[CMS-concurrent-mark: 0.369/0.369 secs] [Times: user=2.05 sys=0.04, real=0.37secs] 【2.并发标记】

2016-01-15T12:58:24.052+0800: 4216.393:[CMS-concurrent-preclean-start]

2016-01-15T12:58:24.091+0800: 4216.433:[CMS-concurrent-preclean: 0.039/0.039 secs] [Times: user=0.04 sys=0.00,real=0.04 secs] 【3.并发预清理】

2016-01-15T12:58:24.091+0800: 4216.433:[CMS-concurrent-abortable-preclean-start]

 CMS: abort preclean due to time2016-01-15T12:58:29.188+0800: 4221.530: [CMS-concurrent-abortable-preclean:5.094/5.097 secs] [Times: user=5.77 sys=0.18, real=5.09 secs]

2016-01-15T12:58:29.189+0800: 4221.531:[GC[YG occupancy: 317194 K (943744 K)]2016-01-15T12:58:29.189+0800: 4221.531:[Rescan (parallel) , 0.0365570 secs]2016-01-15T12:58:29.226+0800: 4221.567:[weak refs processing, 0.0047560 secs]2016-01-15T12:58:29.231+0800: 4221.572:[scrub string table, 0.0006960 secs] [1 CMS-remark: 11025382K(15728640K)]11342577K(16672384K), 0.0425260 secs] [Times: user=0.57 sys=0.01, real=0.05secs] 【4.重新标记,暂停JVM

2016-01-15T12:58:29.232+0800: 4221.574:[CMS-concurrent-sweep-start]

2016-01-15T12:58:30.903+0800: 4223.245:[CMS-concurrent-sweep: 1.666/1.671 secs] [Times: user=1.98 sys=0.06, real=1.67secs] 【5.并发清除】

2016-01-15T12:58:30.903+0800: 4223.245:[CMS-concurrent-reset-start]

2016-01-15T12:58:30.959+0800: 4223.300:[CMS-concurrent-reset: 0.055/0.055 secs] [Times: user=0.03 sys=0.02, real=0.05secs] 【6.并发重置】

如果不发生异常,我们只需要关注初始标记和重新标记。

 promotionfailed日志格式

2016-01-29T00:09:17.127+0800: 1167669.469:[GC2016-01-29T00:09:17.127+0800: 1167669.469: [ParNew (promotion failed): 943655K->943655K(943744K

), 0.1652200 secs]11986693K->12025719K(16672384K), 0.1655820 secs] [Times: user=0.99 sys=0.01,real=0.16 secs]

concurrent modefailure日志格式

2016-01-18T08:49:18.984+0800: 248471.326:[GC2016-01-18T08:49:18.984+0800: 248471.326: [ParNew (promotion failed): 943734K->924083K(943744K), 0.1256890secs]2016-01-18T08:49:19.110+0800: 248471.452:[CMS2016-01-18T08:49:23.288+0800: 248475.629: [CMS-concurrent-sweep:4.197/4.347 secs] [Times: user=4.79 sys=0.02, real=4.35 secs]

 (concurrent mode failure):11272744K->8215769K(15728640K), 10.5375280 secs]12182463K->8215769K(16672384K), [CMS Perm : 45065K->45060K(131072K)],10.6635700 secs] [Times: user=10.95 sys=0.04, real=10.67 secs]

 Full GC日志格式

2016-01-29T00:09:17.293+0800: 1167669.635:[Full GC 2016-01-29T00:09:17.293+0800: 1167669.635:[CMS2016-01-29T00:09:17.456+0800: 1167669.798:

[CMS-concurrent-abortable-preclean:0.447/0.637 secs] [Times: user=2.30 sys=0.19, real=0.64 secs]

 (concurrent mode failure):11082063K->7407560K(15728640K), 5.8053900 secs]12025719K->7407560K(16672384K), [CMS Perm : 45764K->45492K(131072K)],5.8056040 secs] [Times: user=5.75 sys=0.01, real=5.81 secs]

这个不是promotion failed引起的,应该是有较大的对象直接在老年代分配失败造成的,很少出现该现象。

2.3HBase调整CMS参数

原有参数

HBASE_HEAPSIZE:16G

-XX:+UseConcMarkSweepGC:设置年老代为并发收集

-Xmx16G -Xms16G:-Xms、-Xmx 相等以避免在GC 后调整堆的大小。

-Xmn1G:指定New Generation的大小, Yong区设置过大GC时间长。

-XX:PermSize=128M -XX:MaxPermSize=256M

-XX:SurvivorRatio=8:设置堆内存年轻代中Eden区与Survivor区大小的比值 。设置为8,则两个Survivor区与Eden区的比值为2:8,每个Survivor区占 整个年轻代的1/10。 

第一次新增

-XX:CMSInitiatingOccupancyFraction=70:表示年老代空间到70%时就开始执行CMS,确保年老代有足够的空间接纳来自年轻代的对象。

-XX:+UseCMSInitiatingOccupancyOnly:使用CMSInitiatingOccupancyFraction的值作为old区的空间使用率限制来启动CMS垃圾回收。

-XX:+UseGCLogFileRotation-XX:NumberOfGCLogFiles=3 -XX:GCLogFileSize=128M:GC日志rotate

-XX:+UseParNewGC:设置年轻代为并发收集。可与CMS收集同时使用。JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值。

-XX:+CMSParallelRemarkEnabled:并发标记,降低标记停顿,1.6以上默认true。 

依据: CMS GC发生时剩余空间到达90%左右,极易发生promotion failed和concurrent mode failure,调整CMSInitiatingOccupancyFraction使CMS提前发生,给从年轻代提升的对象预留足够的空间。

效果:16台机器RS宕机频率由原来2~3天出现一台,下降至一个月出现一次

如上图,老年代使用达到了90%,此时发生promotion failed,需要提前进行CMS GC。

第二次新增

-XX:+UseCMSCompactAtFullCollection设置在FULL GC的时候,对年老代的压缩;CMS是不会移动内存的, 因此, 这个非常容易产生碎片, 导致内存不够用, 因此, 内存的压缩这个时候就会被启用。 增加这个参数是个好习惯。可能会影响性能,但是可以消除碎片 。

-XX:CMSFullGCsBeforeCompaction=0这个参数,指定进行多少次full GC之后,进行内存空间压缩,0是每次都会。

依据:老年代使用70%时CMS正常发生时出现concurrent mode failure,或老年代空间足够时出现promotionfailed,判断是老年代碎片化严重导致,需要对老年代压缩整理。

效果:2台机器RS宕机频率由原来一个月可能出现一台,修改至今一个多月没有出现,也没再出现promotion failed和concurrent mode failure等异常

如上图,CMS时出现concurrentmode failure,但是空余内存空间3GB以上,属于内存碎片化造成的异常。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java GC 及HBase RegionServer GC调优 的相关文章

  • 在Java Servlet中获取通过jquery ajax发送的参数[重复]

    这个问题在这里已经有答案了 我在网上搜索这个主题 但找不到有效的示例 我会很高兴有人能给我帮助 这就是我测试的 ajax url GetJson type POST dataType json contentType application
  • 二元运算符 >=、-、* 的错误操作数类型

    我无法弄清楚如何修复代码中不断出现的这些错误 import java util Scanner public class Unit02Prog1 public static void main String args Scanner inp
  • java中高效的输入流到字符串方法

    因此 我在 Java 中的 诚然非常简单 应用程序上运行探查器 令我惊讶的是 仅次于需要在时间上发出 HTTP 请求的方法的是我的方法 inputStreamToString方法 目前它的定义如下 public static String
  • Jenkins 未显示 Maven 编译器错误

    在 Jenkins 中构建多模块 maven 3 项目时 如果出现构建错误 我们会收到一条神秘消息 表明 Maven 编译器插件失败 这在上周才刚刚开始发生 INFO BUILD FAILURE INFO INFO Total time 1
  • 如何杀死 Java Future?

    我正在开发的服务使用 Future 来并行运行多个任务 每个任务最多可能需要一分钟才能完成 然而 外部库似乎有问题 因为在某些情况下 2 的时间 它不会返回 在这些情况下 我想给出 2 分钟的等待时间 如果还没有返回 我想杀死 future
  • Java:一种将 Mime(内容)类型与 CommonsMultipartFile 中的文件扩展名相匹配的方法

    在我的公司 出于额外原因 我需要将 mime 类型与文件扩展名进行比较 我有一个CommonsMultipartFile 我正在尝试找出进行这种比较的最佳方法 我见过一个MimetypesFileTypeMap 但不确定这是否适用于此 我试
  • Android 信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR) libwebviewchromium.so

    对于 android 4 4 我多次收到 Native crash at system lib libwebviewchromium so 错误 以下是设备包括 Xperia Z1 SO 01F 16 30 2 Galaxy Tab4 7
  • 使用 https 的 Web 服务身份验证给出错误

    我编写了一个简单的 Web 服务 并使用摘要和 HTTPS 身份验证来保护它 我已经使用 Java 中的 keytool 生成了我的证书 当我通过创建 war 文件在 Tomcat 中部署 Web 服务时 axis 的欢迎页面正确显示 但是
  • Spring 从 JBoss 上下文加载 PropertySourcesPlaceholderConfigurer

    我有一个使用 PropertySourcesPlaceholderConfigurer 的 spring 3 1 应用程序加载设置 我想管理测试和生产环境 只需从服务器上下文加载设置覆盖本地文件属性中指定的设置 下一个示例在 Tomcat
  • java绕中心旋转矩形

    我想围绕其中心点旋转一个矩形 它应该保留在应该绘制的位置并在该空间中旋转 这是我的代码 AffineTransform transform new AffineTransform transform rotate Math toRadian
  • React Native v0.71.8 React-native-vector-icons 你看不到的图标

    我在用react native版本v0 71 8 我安装了react native vector icons库 但图标未显示 似乎链接在最新版本的 React Native 中不再起作用 所以我按照说明进行操作 但它不再编译 出现以下错误
  • 在 Eclipse RCP 应用程序中禁用插件贡献

    我经常遇到这个问题 但尚未找到解决方案 每当我编写一个新的基于 Eclipse RCP 的应用程序并包含来自 Eclipse 平台的插件时 我都会 继承 其中一些插件的 UI 贡献 大多数贡献 菜单项 键盘快捷键 属性页 都很有用 但有时我
  • 如何使用 AffineTransform.quadrantRotate 旋转位图?

    我想旋转一个bitmap关于它的中心点 然后将其绘制成更大的图形上下文 位图是40x40 pixels 图形上下文是500x500 pixels 这就是我正在做的 BufferedImage bi new BufferedImage 500
  • log4j.properties 在 Wildfly 上无法正常工作

    我的类路径中有一个 log4j properties 文件 它位于 APP XX jar log4j properties 位置 我注意到在ear文件中我还可以在lib文件夹中找到log4j 1 2 17 jar 但无论我在 log4j p
  • 在 Tensorflow-lite Android 中将位图转换为 ByteBuffer(浮点)

    在用于图像分类的tensorflow lite android演示代码中 图像首先转换为ByteBuffer格式以获得更好的性能 这种从位图到浮点格式的转换以及随后到字节缓冲区的转换似乎是一个昂贵的操作 循环 按位运算符 float mem
  • 难以理解 通配符

    我有一个非常基本的问题 下面的代码无法编译 假设 Apple Extends Fruit List
  • 如果 Modelmapper 中的整个属性为空,如何排除它们

    ModelMapper 是否 http modelmapper org http modelmapper org 支持什么排除属性 如果该值为空 我刚刚找到了 PropertyMap 但这对我来说是一种限制 因为我必须描述我想要的特定属性
  • 如何更改 JAX-WS Web 服务的地址位置

    我们目前已经公开了具有以下 URL 的 JAX RPC Web 服务 http xx xx xx xx myservice MYGatewaySoapHttpPort wsdl http xx xx xx xx myservice MYGa
  • 用于生成 ISO 文件的 Maven 插件

    有没有可以生成ISO镜像的maven插件 我需要获取一些模块的输出 主要是包含 jar 的 zip 文件 并将它们组合成一个 ISO 映像 Thanks 现在有一个 ISO9660 maven 插件可以完成这项工作 https github
  • MyBatis 枚举的使用

    我知道以前有人问过这个问题 但我无法根据迄今为止找到的信息实施解决方案 所以也许有人可以向我解释一下 我有一个表 状态 它有两列 id 和 name id是PK 我不想使用 POJO Status 而是使用枚举 我创建了这样一个枚举 如下所

随机推荐

  • 【算法】分支定界

    一 基本描述 类似于回溯法 也是一种在问题的解空间树T上搜索问题解的算法 但在一般情况下 分支限界法与回溯法的求解目标不同 回溯法的求解目标是找出T中满足约束条件的所有解 而分支限界法的求解目标则是找出满足约束条件的一个解 或是在满足约束条
  • React组件的生命周期

    1 组件生命周期概述 什么是组件的生命周期 组件从被创建到挂载到页面中运行 再到组件不用时卸载的过程 这个过程就叫做组件的生命周期 react在组件的生命周期中提供了一系统的钩子函数 可以让开发者在函数中注入代码 这些代码会在适当的时候运行
  • java ip解析_java域名解析

    DNS原理 http amon org dns introduction html 根域 就是所谓的 根域服务器只是具有13个IP地址 但机器数量却不是13台 因为这些IP地址借助了 域的划分 根域下来就是顶级域或者叫一级域 每个域都会有域
  • [element-ui] el-dropdown下拉菜单禁用项没有鼠标悬浮禁用样式

    鼠标移入出现禁用样式 如下图 就是我们想要的效果
  • Blender3.5 - 快捷键

    图形移动 框选 gt 刷选 gt 套索选择 W 游标 相当于形状的中心点 shitf 空格 空格 游标回到世界中心 shift C 移动 移动 G 随意移动 选中图形 G 沿 X 轴移动 选中图形 G X 沿 Y 轴移动 选中图形 G Y
  • 动态内存(智能指针与new)

    文章目录 一 引言 二 动态内存管理 1 使用动态内存的原因 2 智能指针 2 1 shared ptr 2 1 1 shared ptr定义与初始化 2 1 2 shared ptr操作 2 1 3 make shared操作 2 1 4
  • 【剑指 Offer】(四种解法)数组中重复的数字

    剑指 Offer 03 数组中重复的数字 题目描述 在一个长度为 n 的数组 nums 里的所有数字都在 0 n 1 的范围内 数组中某些数字是重复的 但不知道有几个数字重复了 也不知道每个数字重复了几次 请找出数组中任意一个重复的数字 示
  • 微信公众号与企业号的TOKEN验证与使用

    上图是 微信客户端与微信服务端与公众号 企业号的服务器的原理架构 首先 我们如果使用应用服务器 则需要告诉微信服务器 它在哪里 所以TOKEN就是一个标识的作用 TOKEN是一个参数 是一个自定义的值 负责标识微信服务器和应用服务是不是一一
  • unity狼模型、山谷模型

    unity狼模型 山谷模型 模型如下图 下载链接在文末 点我下载资源 https download csdn net download weixin 43474701 60362226
  • 如何使用文件作为参数,调用接口并获取返回数据?

    String path picture 20220420 1 doc 指定文件的路径 或相对路径 File file new File path System out println 文件名 file getName 文件绝对路径 file
  • 百度AI攻略:增值税发票识别

    1 功能描述 在日常工作中经常要用到增值税发票 在使用的时候需要对增值税发表进行检查 验真 录入等很多工作 使用增值税发票识别技术 实现对增值税普票或专票各字段信息的识别和录入 可应用于企业税务核算及内部报销等场景 能够有效减少人工核算工作
  • Tensorflow与Python、CUDA、cuDNN的版本对应表

    1 官方配置 官网只有英文版的才更新到了TensorFlow 2 12 0 中文版只更新到了2 6 0 所以要想看到下面的内容需要进入官网之后将语言更改为英文 经过测试的构建配置 Linux CPU Version Python versi
  • Spring Cloud简介:构建分布式微服务架构的利器

    标题 Spring Cloud简介 构建分布式微服务架构的利器 摘要 本文介绍了Spring Cloud作为构建分布式微服务架构的利器 我们将深入探讨Spring Cloud的重要组件和功能 并通过代码示例展示Spring Cloud的强大
  • 非线性控制1——经典控制和现代控制的区别

    经典控制和现代控制的区别
  • 三次登录验证和验证码功能实现

    三次登录验证和验证码功能实现 最近手头上的事忙的差不多了 就想着自己写写小demo玩一下 结果突然看到我们旧系统的登录好像有点拉胯 然后就自己写了个小demo 指不定哪天就用上了呢 一 pom文件 首先当然是pom文件啦 这里写的比较简单
  • chatgpt赋能python:Python中的三角函数:了解sin、cos和tan

    Python中的三角函数 了解sin cos和tan Python是一种强大的编程语言 可以应用于处理各种数据类型和数学计算 包括三角函数 在这篇文章中 我们将深入了解Python中的三角函数 包括sin cos和tan 什么是三角函数 在
  • 嵌入式平台memcpy实验总结

    1 概述 最近项目中性能比较吃紧 经过跟踪发现 memcpy操作的性能存在一定问题 于是 做了一些尝试去验证一些想法 记录一下 环境 MDK530 Cortex M0芯片 主频80MHz左右 2 优化手段 在优化之前 我们要先确定基本的性能
  • 【MATLAB第37期】 #保姆级教程 XGBOOST模型参数完整且详细介绍,调参范围、思路及具体步骤介绍

    MATLAB第37期 保姆级教程 XGBOOST模型参数完整且详细介绍 调参范围 思路及具体步骤介绍 一 XGBOOST参数介绍 一 模型参数 1 XGBoost模型 default gbtree 有两种模型可以选择gbtree和gblin
  • 【Git】git概述

    00 目录 文章目录 00 目录 01 关于版本控制 1 1 本地版本控制系统 1 2 集中化的版本控制系统 1 3 分布式版本控制系统 02 Git简史 03 Git 是什么 3 1 直接记录快照 而非差异比较 3 2 所有操作都是本地执
  • Java GC 及HBase RegionServer GC调优

    1背景 1 1问题描述 HBase RegionServer由于GC等原因Stop World超过40s RS在ZK上创建的临时节点被删除 造成Master认为RS已经下线 重新分配该RS上的Region RS恢复后 由于种种原因 WAL被