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

news/2024/5/19 17:16:31

常见命令

以下命令的介绍,全部在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.mrgr.cn/p/27200625

相关文章

微信小程序关于主包大小不能超过1.5MB的问题

常规的解决办法有以下几种 1、把资源文件改成远程服务器的,比如png这些 2、进入如图的分析页面,能明确知道你哪个插件包太大,我这里之前echart的包就1mb,现在给他缩减到了500kb的样子 3、解决vant等npm包太大的问题&#xff0c…

Linux——NFS网络文件系统

在生产环境中共享宿主目录可以用于集中管理账户 一、存储设备 DAS 是直连存储相当于移动硬盘 NAS 是网络文件系统,挂载后可以直接访问 SAN 存储区域网络 IPSAN 网线连接 共享的是设备,需要挂载后分区使用 FCSAN 光纤连接 二、服务的管理 1、安…

【C++杂货铺】多态

目录 🌈前言🌈 📁多态的概念 📁 多态的定义及实现 📂 多态的构成条件 📂 虚函数 📂 虚函数重写 📂 C11 override 和 final 📂 重载,覆盖(重写…

《HCIP-openEuler实验指导手册》1.6 Apache静态资源配置

知识点 常用用途: 软件仓库镜像及提供下载服务: 配置步骤 删除网站主目录中的文件(本实验机目录为/home/source ip为192.168.12.137 端口为81) cd /home/source rm -rf *在主目录中新建6个文件夹如下图 mkdir test{1..6}新建…

redis常用数据结构

redis常用数据结构 Redis 底层在实现下面数据结构的时候,会进行特定的优化,来达到节省时间/空间的效果。 内部结构 String raw(最基本的字符串),int(实现计数功能,当value为整数的时候会用整…

python基础——正则表达式

📝前言: 这篇文章主要想讲解一下python中的正则表达式: 1,什么是正则表达式 2,re模块三匹配 3,元字符匹配 4,具体示例 🎬个人简介:努力学习ing 📋个人专栏&am…

TreeSet 和 TreeMap 和 HashSet 和 HashMap

一、二叉搜索树 1、概念 (1)二叉搜索树 要么是一棵空树,要么就得满足左子树上所有结点的值都小于根结点的值,右子树上所有结点的值都大于根结点的值,即左边比我小,右边比我大。二叉树的左右子树也分别都是…

IntelliJ IDEA2020下使用Maven构建Scala 项目

1.创建maven文件 2.进入pom.xml导入依赖 <!--添加spark的依赖--><dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.12</artifactId><version>3.2.1</version></dependency><!--添加scala依…

玩转nginx的配置文件3

1. limit_req_zone配置限流 limit_req_zone $binary_remote_addr zonemylimit:10m rate10r/s;upstream myweb {server 10.0.105.196:80 weight1 max_fails1 fail_timeout1;}server {listen 80;server_name localhost;location /login {limit_req zonemylimit;proxy_pass http:…

.net8系列-04图文并茂手把手教你配置Swagger支持token以及实现Swagger扩展,Swagger代码单独抽离

前情提要 接上篇文章,我们当前已完成如下内容:创建应用成功 创建接口成功 配置Swagger实现接口注释和版本控制 本文章主要内容为: 配置Swagger支持token传值测试接口快速上手-代码配置 添加如下代码 文件目录:\xiaojinWebApplication\xiaojinWebApplication\Program.cs// S…

【OceanBase诊断调优】——hpet(高精度时钟源)引起的CPU高问题排查

最近总结一些诊断OCeanBase的一些经验&#xff0c;出一个【OceanBase诊断调优】专题出来&#xff0c;也欢迎大家贡献自己的诊断OceanBase的方法。 1. 前言 昨天在问答区帮忙排查一个用户CPU高的问题&#xff0c;帖子链接&#xff1a;《刚刚新安装的OceanBase集群&#xff0c;…

万业企业发布23年年报、24年一季报,集成电路业务同比大增近七成 转型成效显著

4月26日晚间&#xff0c;万业企业&#xff08;600641&#xff09;发布2023年年度报告及2024年一季度报告。2023年&#xff0c;公司实现营业收入9.65亿元&#xff0c;归母净利润1.51亿元。其中&#xff0c;公司集成电路设备制造业务收入较上年同期大幅增长67.53%&#xff0c;公司…

Synchronized关键字的深入分析

一、引言 在多线程编程中&#xff0c;正确地管理并发是确保程序正确运行的关键。Java提供了多种同步工具&#xff0c;其中synchronized关键字是最基本且最常用的同步机制之一。本文旨在深入解析synchronized的实现原理&#xff0c;探讨其在不同应用场景中的使用&#xff0c;并…

.net报错异常及常用功能处理总结(持续更新)

@目录1. WebApi dynamic传参解析结果中ValueKind = Object处理方法问题描述方案1:(推荐,改动很小)方案2:2.C# .net多层循环嵌套结构数据对象如何写对象动态属性赋值问题描述JavaScript动态属性赋值.net动态属性赋值3.Object.GetType().GetProperty().GetValue()读取对象报错…

微信小程序实战项目开发(天气预报项目实战):内涵开发说明文档、需求文档 手把手分步骤教你写出自己的小程序项目 天气预报小程序 时实请求获取天气 自定义功能 完整的源代码

文章目录 微信小程序开发实现天气预报 一、项目需求分析需求分析实现思路分析详解如下&#xff1a;1、创建项目、全局配置 json 文件2、在 wxml文件中完成布局3、wxss的实现美化效果颜色渐变效果&#xff1a;鼠标 hover 浮动阴影效果&#xff1a;圆角效果底部按钮button使用fle…

Blender点操作

顶点操作即一般的“布线”操作 1.顶点移动 -先切到顶点模式 -移动&#xff0c;G 或 G X/Y/Z -旋转&#xff0c;R 同上 -缩放&#xff0c;S 同上 2.顶点滑移&#xff0c;用于微调顶点的位置 快捷键&#xff1a;Shift V&#xff0c;G G 3.顶点删除 -选中一个顶点 -按…

单机三pxc节点集群,+docker-haproxy2.0负载均衡实现

一.下载 https://www.haproxy.org/download/2.0/src/haproxy-2.0.5.tar.gz 或者在这里下载&#xff08;下面需要的各个配置文件都有&#xff09;&#xff1a; https://download.csdn.net/download/cyw8998/89170129 二.编写文件&#xff0c;制作docker镜像 1.Dockerfile&a…

SpringBoot源码阅读2-自动配置

SpringBoot源码阅读2-自动配置 在传统的Spring应用中&#xff0c;开发者需要手动配置一系列Web应用的核心组件&#xff0c;例如DispatcherServlet用于处理请求分发、ViewResolver用于视图解析、CharacterEncodingFilter用于字符编码过滤等。 然而在SpringBoot中只要引入了spr…

Mudem,打造私密安全、高效稳定的私人空间

Mudem 是 Codigger 平台中的一个关键组件&#xff0c;它提供基础通讯服务&#xff0c;确保不同类型的机器之间可以进行安全和高效的连接。它其设计理念在于将本地机器、公有云以及私有云上的设备无缝地整合为一个可远程在线访问的工作站&#xff08;Workstation&#xff09;。这…

Flutter 上架如何解决 ITMS-91053 问题

最近&#xff0c;我的 Flutter App 发布到 TestFlight 后&#xff0c;就会收到一封邮件&#xff1a;The uploaded build for YOUR APP has one or more issues. 上面的邮件主要是说&#xff0c;我的 App 缺少了调用 API 的声明&#xff0c;以前从来没看到过&#xff0c;上网一查…