Java基础之JVM基础调优与常见问题

常见命令

以下命令的介绍,全部在jdk8环境下运行的;

jps ☆☆☆☆☆

查看当前运行的进程号;

jmap ☆☆☆

jmap命令可以查看jvm的内存信息,class对应的实例个数以及占用的内存大小

jmap -histo

查看当前java进程
[rd@VM-8-12-centos ~]$ jps
8368 Jps
20073 CpuTopThreadHelper# 查看历史生成的实例
jmp -histo:live 20073# 查看当前进程存活的实例,其中执行过程中,可能会触发一次fullgc
jmap -histo:live 20073

列头说明:

  • num:序号
  • instantces:实例数
  • bytes:占用空间大小
  • class name:类名称
    • [C:char[]
    • [S:short[]
    • [I:int[]
    • [B:byte[]
    • [[I:int[][]

jmap -heap ☆☆☆☆

打印堆信息

[rd@VM-8-12-centos ~]$ jmap -heap 20073
Attaching to process ID 20073, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.361-b09using thread-local object allocation.
Parallel GC with 2 thread(s)Heap Configuration:MinHeapFreeRatio         = 0MaxHeapFreeRatio         = 100MaxHeapSize              = 968884224 (924.0MB)NewSize                  = 19922944 (19.0MB)MaxNewSize               = 322961408 (308.0MB)OldSize                  = 40894464 (39.0MB)NewRatio                 = 2SurvivorRatio            = 8MetaspaceSize            = 21807104 (20.796875MB)CompressedClassSpaceSize = 1073741824 (1024.0MB)MaxMetaspaceSize         = 17592186044415 MBG1HeapRegionSize         = 0 (0.0MB)Heap Usage:
PS Young Generation
Eden Space:capacity = 15728640 (15.0MB)used     = 0 (0.0MB)free     = 15728640 (15.0MB)0.0% used
From Space:capacity = 2097152 (2.0MB)used     = 0 (0.0MB)free     = 2097152 (2.0MB)0.0% used
To Space:capacity = 2097152 (2.0MB)used     = 0 (0.0MB)free     = 2097152 (2.0MB)0.0% used
PS Old Generationcapacity = 16252928 (15.5MB)used     = 260944 (0.2488555908203125MB)free     = 15991984 (15.251144409179688MB)1.6055199407762097% used694 interned Strings occupying 46296 bytes.

jmap -dump

导出堆内存快照,用于分析执行dump操作时进程运行状态;

jmap -dump:format=b,file=/home/rd/20073.hprof 20073

进行启动时,可以设置在内存溢出时,自动dump当时内存快照(堆内存很大时,可能会dump失败),具体参数如下:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./xxxx.hprof

jstack ☆☆☆☆

查看当前进程下线程的运行情况,可以用来判断线程占用cpu情况,以及线程锁占用情况;

-- jstack pid
jstack 3305

部分字段说明: 

  • prio:jvm线程优先级
  • os_prio:操作系统线程优化级
  • tid:jvm线程id
  • nid:操作系统线程id(十六进制)

jinfo ☆☆

查看正在运行的java应用程序的扩展参数;

查看jvm的参数:

[rd@VM-8-12-centos project]$ jinfo -flags 23852
Attaching to process ID 23852, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.361-b09
Non-default VM flags: 
-XX:CICompilerCount=2 
-XX:InitialHeapSize=60817408 
-XX:MaxHeapSize=968884224 
-XX:MaxNewSize=322961408 
-XX:MinHeapDeltaBytes=524288 
-XX:NewSize=19922944 
-XX:OldSize=40894464 
-XX:+UseCompressedClassPointers 
-XX:+UseCompressedOops 
-XX:+UseParallelGC 
Command line:  
[rd@VM-8-12-centos project]$

 查看java系统参数

[rd@VM-8-12-centos project]$ jinfo -flags 23852
Attaching to process ID 23852, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.361-b09
Non-default VM flags: -XX:CICompilerCount=2 -XX:InitialHeapSize=60817408 -XX:MaxHeapSize=968884224 -XX:MaxNewSize=322961408 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=19922944 -XX:OldSize=40894464 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC 
Command line:  
[rd@VM-8-12-centos project]$ ^C
[rd@VM-8-12-centos project]$ jinfo -sysprops 23852
Attaching to process ID 23852, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.361-b09
java.runtime.name = Java(TM) SE Runtime Environment
java.vm.version = 25.361-b09
sun.boot.library.path = /usr/local/java/jre/lib/amd64
java.vendor.url = http://java.oracle.com/
java.vm.vendor = Oracle Corporation
path.separator = :
file.encoding.pkg = sun.io
java.vm.name = Java HotSpot(TM) 64-Bit Server VM
sun.os.patch.level = unknown
sun.java.launcher = SUN_STANDARD
user.country = US
user.dir = /home/rd/project
java.vm.specification.name = Java Virtual Machine Specification
java.runtime.version = 1.8.0_361-b09
java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment
os.arch = amd64
java.endorsed.dirs = /usr/local/java/jre/lib/endorsed
java.io.tmpdir = /tmp
line.separator = java.vm.specification.vendor = Oracle Corporation
os.name = Linux
sun.jnu.encoding = UTF-8
java.library.path = /usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
java.specification.name = Java Platform API Specification
java.class.version = 52.0
sun.management.compiler = HotSpot 64-Bit Tiered Compilers
os.version = 3.10.0-1160.71.1.el7.x86_64
user.home = /home/rd
user.timezone = 
java.awt.printerjob = sun.print.PSPrinterJob
file.encoding = UTF-8
java.specification.version = 1.8
user.name = rd
java.class.path = .:/usr/local/java/lib/dt.jar:/usr/local/java/lib/tools.jar
java.vm.specification.version = 1.8
sun.arch.data.model = 64
sun.java.command = com.ddu.jvm.DeadThreadHelper
java.home = /usr/local/java/jre
user.language = en
java.specification.vendor = Oracle Corporation
awt.toolkit = sun.awt.X11.XToolkit
java.vm.info = mixed mode
java.version = 1.8.0_361
java.ext.dirs = /usr/local/java/jre/lib/ext:/usr/java/packages/lib/ext
sun.boot.class.path = /usr/local/java/jre/lib/resources.jar:/usr/local/java/jre/lib/rt.jar:/usr/local/java/jre/lib/jsse.jar:/usr/local/java/jre/lib/jce.jar:/usr/local/java/jre/lib/charsets.jar:/usr/local/java/jre/lib/jfr.jar:/usr/local/java/jre/classes
java.vendor = Oracle Corporation
java.specification.maintenance.version = 4
file.separator = /
java.vendor.url.bug = http://bugreport.sun.com/bugreport/
sun.io.unicode.encoding = UnicodeLittle
sun.cpu.endian = little
sun.cpu.isalist = 

jstat ☆☆☆☆☆

实际开发中,经常可以用到的命令,用来查看当前java进行内存使用情况;

jstat [-命令选项][vmid][间隔时间(毫秒)][查询次数]

垃圾回收统计

jstat -gc pid 最常用的命令,可以评估程序内存使用情况以及GC压力的整体情况

[rd@VM-8-12-centos project]$ jstat -gc 23852 5000 10S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
2048.0 2048.0  0.0    0.0   15360.0   4302.9   39936.0      0.0     4480.0 779.8  384.0   76.0       0    0.000   0      0.000    0.000
2048.0 2048.0  0.0    0.0   15360.0   4302.9   39936.0      0.0     4480.0 779.8  384.0   76.0       0    0.000   0      0.000    0.000
2048.0 2048.0  0.0    0.0   15360.0   4302.9   39936.0      0.0     4480.0 779.8  384.0   76.0       0    0.000   0      0.000    0.000

单位统一为:KB 

  • S0C:新生代第一个Survivor区的大小,单位KB
  • S1C:新生代第二个Survivor区的大小
  • S0U:新生代第一个幸存区的使用大小
  • S1U:新生代第二个幸存区的使用大小
  • EC:Eden区的大小
  • EU:Eden区的使用大小
  • OC:老年代的大小
  • OU:老年代的使用大小
  • MC:方法区(元空间)大小
  • MU:方法区(元空间)使用大小
  • CCSC:压缩类空间大小
  • CCSU:压缩类空间使用大小
  • YGC:年轻代垃圾回收次数(从当前进程启动开始至当前时间发生的YGC)
  • YGCT:年轻代垃圾回收消耗时间,单位s(从当前进程启动开始至当前时间发生的YGCT)
  • FGC:老年代垃圾回收次数(从当前进程启动开始至当前时间发生的FYGC)
  • FGCT:老年代垃圾回收消耗时间,单位s(从当前进程启动开始至当前时间发生的FYGCT)
  • GCT:垃圾回收总消耗时间,单位s(从当前进程启动开始至当前时间发生的GCT)

堆内存统计

[rd@VM-8-12-centos project]$ jstat -gccapacity 23852NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC 19456.0 315392.0  19456.0 2048.0 2048.0  15360.0    39936.0   630784.0    39936.0    39936.0      0.0 1056768.0   4480.0      0.0 1048576.0    384.0      0     0
[rd@VM-8-12-centos project]$ 
  • NGCMN:新生代最小容量
  • NGCMX:新生代最大容量
  • NGC:当前新生代容量
  • S0C:第一个Survivor大小
  • S1C:第二个Survivor的大小
  • EC:Eden区的大小
  • OGCMN:老年代最小容量
  • OGCMX:老年代最大容量
  • OGC:当前老年代大小
  • OC:当前老年代大小
  • MCMN:最小元数据容量
  • MCMX:最大元数据容量
  • MC:当前元数据空间大小
  • CCSMN:最小压缩类空间大小
  • CCSMX:最大压缩类空间大小
  • CCSC:当前压缩类空间大小
  • YGC:年轻代gc次数
  • FGC:老年代GC次数

 新生代垃圾回收统计

[rd@VM-8-12-centos project]$ jstat -gcnew 23852S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT  
2048.0 2048.0    0.0    0.0 15  15    0.0  15360.0   4302.9      0    0.000
  • S0C:第一个Survivor的大小
  • S1C:第二个Survivor的大小
  • S0U:第一个Survivor的使用大小
  • S1U:第二个Survivor的使用大小
  • TT:对象在新生代存活的次数
  • MTT:对象在新生代存活的最大次数
  • DSS:期望的幸存区大小
  • EC:Eden区的大小
  • EU:Eden区的使用大小
  • YGC:年轻代垃圾回收次数
  • YGCT:年轻代垃圾回收消耗时间

新生代内存统计

[rd@VM-8-12-centos project]$ jstat -gcnewcapacity 23852NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC 19456.0   315392.0    19456.0 104960.0   2048.0 104960.0   2048.0   314368.0    15360.0     0     0
  • NGCMN:新生代最小容量
  • NGCMX:新生代最大容量
  • NGC:当前新生代容量
  • S0CMX:第一个Survivor区最大大小
  • S0C:第一个Survivor区当前大小
  • S1CMX:第二个Survivor区最大大小
  • S1C:第二个Survivor区当前大小
  • ECMX:最大Eden区大小
  • EC:当前Eden区大小
  • YGC:年轻代垃圾回收次数
  • FGC:老年代回收次数

 老年代垃圾回收统计

[rd@VM-8-12-centos project]$ jstat -gcold 23852MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT     GCT   4480.0    779.8    384.0     76.0     39936.0         0.0      0     0    0.000    0.000
  • MC:方法区大小
  • MU:方法区使用大小
  • CCSC:压缩类空间大小
  • CCSU:压缩类空间使用大小
  • OC:老年代大小
  • OU:老年代使用大小
  • YGC:年轻代垃圾回收次数
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

 老年代内存统计

[rd@VM-8-12-centos project]$ jstat -gcoldcapacity 23852OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT     GCT   39936.0    630784.0     39936.0     39936.0     0     0    0.000    0.000
  • OGCMN:老年代最小容量
  • OGCMX:老年代最大容量
  • OGC:当前老年代大小
  • OC:老年代大小
  • YGC:年轻代垃圾回收次数
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

元数据空间统计

[rd@VM-8-12-centos project]$ jstat -gcmetacapacity 23852MCMN       MCMX        MC       CCSMN      CCSMX       CCSC     YGC   FGC    FGCT     GCT   0.0  1056768.0     4480.0        0.0  1048576.0      384.0     0     0    0.000    0.000
  • MCMN:最小元数据容量
  • MCMX:最大元数据容量
  • MC:当前元数据空间大小
  • CCSMN:最小压缩类空间大小
  • CCSMX:最大压缩类空间大小
  • CCSC:当前压缩类空间大小
  • YGC:年轻代垃圾回收次数
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间
[rd@VM-8-12-centos project]$ jstat -gcutil 23852S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   0.00   0.00  28.01   0.00  17.41  19.80      0    0.000     0    0.000    0.000
  • S0:幸存1区当前使用比例
  • S1:幸存2区当前使用比例
  • E:伊甸园区使用比例
  • O:老年代使用比例
  • M:元数据区使用比例
  • CCS:压缩使用比例
  • YGC:年轻代垃圾回收次数
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

常见问题

一 CPU使用率持续99.9%☆☆☆☆☆

实例代码:

package com.ddu.jvm;/*** CPU飙高** @author wucj* @date 2024/04/16*/
public class CpuTopThreadHelper {public static void main(String[] args) {run();}private static void run() {CpuTopThreadHelper helper = new CpuTopThreadHelper();while (true) {helper.sum();}}private static int sum() {int a = 100;int b = 200;int c = (a + b) * 325;return c;}
}

1.1 找到当前机器上运行的java进程号

 

1.2 查看当前进程下线程占用cpu情况

top命令查看当前进程下线程占用cpu情况

top -p 3305

 1.3 查看当前进程下线程的cpu占用情况

在上述步骤(top -p pid)基础上按大写H,查看当前进程下线程的cpu占用情况

从上述打印结果看,当前进程(pid=3305)下操作系统线程号=3306的线程,占用cpu 99.9%;

因为jstack中打印的操作系统线程号为十六进制的,因此需要将操作系统下的线程号转成十六进制;

  • 操作系统进程号=3306转成十六进制=cea

1.4 查看当前进程下指定操作系统线程号占用内存情况

通过jstack命令查看当前进程下指定操作系统线程号占用内存情况

jstack 3305 |grep cea -C 10

通过上述打印的日志,可以看到如下代码占用长时间占用cpu

 at com.ddu.jvm.CpuTopThreadHelper.run(CpuTopThreadHelper.java:17)

二 排查死锁 ☆☆☆☆☆

源码:

package com.ddu.jvm;/*** @date 2024/04/16*/
public class DeadThreadHelper {private static Object obj1 = new Object();private static Object obj2 = new Object();private static Object obj3 = new Object();private static Object obj4 = new Object();public static void main(String[] args) {new Thread(() -> {synchronized (obj1) {System.out.println(Thread.currentThread().getName() + " locked obj1");sleep(5);synchronized (obj2) {System.out.println(Thread.currentThread().getName() + " release obj1");}}}).start();new Thread(() -> {synchronized (obj3) {System.out.println(Thread.currentThread().getName() + " locked obj3");sleep(5000000);}}).start();new Thread(() -> {synchronized (obj2) {System.out.println(Thread.currentThread().getName() + " locked obj2");sleep(5);synchronized (obj1) {System.out.println(Thread.currentThread().getName() + " release obj2");}}}).start();new Thread(() -> {synchronized (obj4) {System.out.println(Thread.currentThread().getName() + " locked obj4");sleep(5000000);}}).start();}private static void sleep(int seconds) {try {Thread.sleep(seconds * 1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}
}
jstack 23852 > xxxx.info

分析:从上述jstack打印的进程锁占用情况分析,其中Thread-2 Thread-1互相持有对方需要的锁,造成了死锁

线程持有锁-locked等待锁-waiting to lock
Thread-20x00000000ecc5bed80x00000000ecc5bec8
Thread-00x00000000ecc5bec80x00000000ecc5bed8

 

三、内存泄露是如何发生的?

        比如日常开发中,我们可能会使用hashmap,不断往里面放缓存数据,但是忘记考虑这个map的容量问题,结果这个缓存map越来越大,持续占用着老年代的很多空间,时间长了就会导致频繁的full gc,这就是一种内存泄漏的场景;

对于一些老旧数据没有及时清理导致一直占用着宝贵的内存资源,时间长了除了导致full gc,还有可能导致OOM。这种情况完全可以考虑采用一些成熟的JVM级缓存框架来解决,比如Guava cache、Redis等;

四、case:系统频繁Full GC导致系统卡顿是怎么回事?

首先考虑是否有大对象查询在周期性执行,导致老年代内存周期性被占用,导致Full GC

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/314084.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARM学习(26)链接库的依赖查看

笔者今天来聊一下查看链接库的依赖。 通常情况下,运行一个可执行文件的时候,可能会出现找不到依赖库的情况,比如图下这种情况,可以看到是缺少了license.dll或者libtest.so,所以无法运行。怎么知道它到底缺少什么dll呢&…

多输入多输出 | Matlab实现WOA-LSSVM鲸鱼算法优化最小二乘支持向量机多输入多输出预测

多输入多输出 | Matlab实现WOA-LSSVM鲸鱼算法优化最小二乘支持向量机多输入多输出预测 目录 多输入多输出 | Matlab实现WOA-LSSVM鲸鱼算法优化最小二乘支持向量机多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 Matlab实现WOA-LSSVM鲸鱼算法优化…

SpringCloud系列(5)--SpringCloud微服务工程公共部分提取

前言:在上一章节中我们创建了两个个SpringCloud工程,但在两个工程中分别存在着一些重复的部分,例如重复的实体类(如图所示),这样会造成系统的冗余,所以我们需要把公共的类提取到一个工程里&…

AOC vs. DAC:哪个更适合您的网络需求?

在现代网络通信中,选择合适的连接线缆对于数据传输的稳定性和速度至关重要。两种常见的线缆类型是 AOC(Active Optical Cable) 和 DAC(Direct Attach Cable)。本文将详细介绍这两种线缆的特点、优势和适用场景&#xf…

03_Scala变量和数据类型

文章目录 [toc] **变量和数据类型****1.注释****2.变量和常量****3. 标识符的命名规范****4.scala的字符串****5.键盘输入****5.1 StdIn.readLine()****5.2 从文件中读取数据****5.3 Scala向外写数据** 变量和数据类型 1.注释 和Java完全一样 ** ** 2.变量和常量 var name…

LiveNVR监控流媒体Onvif/RTSP常见问题-如何对比监控摄像头延时视频流延时支持webrtc视频流播放超低延时播放

LiveNVR如何对比监控摄像头延时视频流延时支持webrtc视频流播放超低延时播放 1、问题场景2、如何对比延时?3、WEBRTC延时对比4、LiveNVR支持WEBRTC输出5、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、问题场景 需要低延时的视频流监控播放,之前可以用rtmp…

OpenHarmony实战开发-媒体查询 (@ohos.mediaquery)

概述 媒体查询作为响应式设计的核心,在移动设备上应用十分广泛。媒体查询可根据不同设备类型或同设备不同状态修改应用的样式。媒体查询常用于下面两种场景: 针对设备和应用的属性信息(比如显示区域、深浅色、分辨率)&#xff0…

新手Pytorch入门笔记-transforms.Compose()

我使用的图片是上图,直接下载即可 transforms.Compose 是PyTorch中的一个实用工具,用于创建一个包含多个数据变换操作的变换对象。这些变换操作通常用于数据预处理,例如图像数据的缩放、裁剪、旋转等。使用transforms.Compose 可以将多个数据…

如何在 Flutter 中制作多种颜色的 TextField

TextField widget 本身并不施加任何样式。相反,它会要求 TextEditingController 生成一个样式化的 TextSpan 对象,即一段带有样式的文本。 TextField 将其样式传递给 TextEditingController ,默认实现只是将其放入 TextSpan 对象中&#xff0…

基于SSM+Vue的护工预约服务小程序和后台管理系统

1、系统演示视频(演示视频) 2、需要请联系

【GIS教程】ArcGIS做日照分析(附练习数据下载)

我国对住宅日照标准的规定是:冬至日住宅底层日照不少于1小时或大寒日住宅层日照不少于2小时(通常以当地冬至日正午12时的太阳高度角作为依据)。因冬至日太阳高度角最低,照射范围最小,如果冬至日12:00建筑物底层能够接收到阳光,那么…

kubernetes部署控制器Deployment

一、概念 在学习rc和rs控制器资源时,这两个资源都是控制pod的副本数量的,但是,他们两个有个缺点,就是在部署新版本pod或者回滚代码的时候,需要先apply资源清单,然后再删除现有pod,通过资源控制&…

[Flutter3] 记录Dio的简单封装(一)

文章目录 效果使用ResponseEntity类DioManager封装_onResponse / _onDioException 的设计Response的处理catch处理 效果 请求成功/失败/异常的日志输出效果 成功: 失败:500 失败:404 网络异常: 使用 举个使用的例子, 在调用 DioManager的时候, 直接通过返回值的状态, 来…

森林消防隔膜泵的应用与前景——恒峰智慧科技

随着全球气候变暖,森林火灾频发,给生态环境和人类安全带来严重威胁。为有效应对这一挑战,森林消防领域不断引入新技术、新装备。其中,隔膜泵作为一种高效、可靠的消防设备,正逐渐受到广泛关注。本文将探讨森林消防隔膜…

Python Flask Web框架快速入门

Flask 入门Demo Flask 开发环境搭建,执行如下指令: pip install flask # 第一节: Flask 快速入门from flask import Flask app Flask(__name__)app.route(/flask) def hello_flask():return Hello Flaskapp.run() 核心代码剖析: 从 fla…

五种主流数据库:集合运算

关系型数据库中的表与集合理论中的集合类似,表是由行(记录)组成的集合。因此,SQL 支持基于数据行的各种集合运算,包括并集运算(Union)、交集运算(Intersect)和差集运算&a…

springcloud Ribbon的详解

1、Ribbon是什么 Ribbon是Netflix发布的开源项目,Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的框架。 2、Ribbon能干什么 LB负载均衡(Load Balance)是什么?简单的说就是将用户的请求平摊的分配到多个服务上,从而达…

C++:const成员和取地址操作符

目录 一、const成员 二、取地址及const取地址操作符重载 一、const成员 将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数 隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。 注&…

ESLlint重大更新后,使用旧版ESLint搭配Prettier的配置方式

概要 就在前几天,ESLint迎来了一次重大更新,9.0.0版本,根据官方文档介绍,使用新版的先决条件是Node.js版本必须是18.18.0、20.9.0,或者是>21.1.0的版本,新版ESLint将不再直接支持以下旧版配置(非扁平化…

【CSS】使用 scroll snap 实现页面的垂直大屏滚动

CSS 属性 scroll-snap-type 设置了在有滚动容器的情形下吸附至吸附点的严格程度。 scroll-snap-type 使用 scroll snap 也可以用于垂直滚动&#xff0c;全屏展示就是一个很好的例子: <main><section class"section section-1"></section><sect…