简单理解常量、常量池、运行时常量池和字符串常量池

2023-11-12

1、常量
常量在java中就值的是一般的字面量,比如字符串,整数,浮点数等等数据。简单理解java中什么叫常量

2、常量池,也叫静态常量池或者class文件常量池,说常量池一定要指明是编译器产生的。它的组成为字面量和符号引用
在这里插入图片描述
3、运行时常量池。当类加载到内存中后,jvm就会将class常量池中的内容存放到运行时常量池中,由此可知,运行时常量池也是每个类都有一个。运行时常量池在jdk1.8时,在方法区(即元空间)中。

4、字符串常量池。就是String类型的字符串,包括代码写的字符串,比如方法名,类名都是字面量,还有String定义的字符串。字符串常量池,jdk1.8时在堆中,全局共享,独一份,之前在方法区中。

那么问题就来了,
1、字符串常量池在1.8时在堆内存中,如何证明。
2、字符串常量能被GC回收吗?
3、如何证明jdk1.8方法区为元空间。参考简单理解jdk1.8中的方法区


上面1和2问题,通过一个实例可以证明,
先设置JVM虚拟机启动参数-Xms1m -Xmx1m -XX:+PrintGCDetails -XX:MaxMetaspaceSize=8m。把堆内存设置小一点,1M。

public class DemoClass {
    public static void main(String[] args) throws Exception {
        //字符串常量池在哪,在堆中。并且常量也会被GC回收。
        String s = "love";
        for (int i = 0; i < 10000000; i++) {
            s = s + "qsm-qsm-qsm-qsm-qsm-qsm-qsm-qsm-qsm-qsm-qsm-qsm-qsm-qsm-qsm-qsm-qsm-qsm-qsm-qsm-qsm-qsm-qsm-qsm-qsm-qsm-qsm-qsm-qsm";
            if (i%10==0){
                System.out.println("第"+i+"次");
                Thread.sleep(100);
            }
        }
    }
}

运行的结果截取一部分,如下

[GC (Allocation Failure) [PSYoungGen: 512K->488K(1024K)] 512K->496K(1536K), 0.0010906 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
Connected to the target VM, address: '127.0.0.1:51561', transport: 'socket'
[GC (Allocation Failure) [PSYoungGen: 1000K->504K(1024K)] 1008K->632K(1536K), 0.0045804 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 1002K->506K(1024K)] 1130K->786K(1536K), 0.0192090 secs] [Times: user=0.02 sys=0.00, real=0.02 secs] 
[GC (Allocation Failure) [PSYoungGen: 1013K->488K(1024K)] 1294K->896K(1536K), 0.0077057 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 
[Full GC (Ergonomics) [PSYoungGen: 488K->463K(1024K)] [ParOldGen: 408K->358K(512K)] 896K->822K(1536K), [Metaspace: 2930K->2930K(1056768K)], 0.0062971 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[Full GC (Ergonomics) [PSYoungGen: 974K->442K(1024K)] [ParOldGen: 358K->343K(512K)] 1332K->785K(1536K), [Metaspace: 3141K->3141K(1056768K)], 0.0066005 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
第0次
[Full GC (Ergonomics) [PSYoungGen: 954K->429K(1024K)] [ParOldGen: 343K->363K(512K)] 1297K->793K(1536K), [Metaspace: 3399K->3399K(1056768K)], 0.0065477 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
第10次
---
---
[Full GC (Ergonomics) [PSYoungGen: 603K->599K(1024K)] [ParOldGen: 480K->480K(512K)] 1084K->1080K(1536K), [Metaspace: 3405K->3405K(1056768K)], 0.0065548 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[Full GC (Ergonomics) [PSYoungGen: 940K->769K(1024K)] [ParOldGen: 480K->480K(512K)] 1421K->1250K(1536K), [Metaspace: 3405K->3405K(1056768K)], 0.0064790 secs] [Times: user=0.06 sys=0.00, real=0.01 secs] 
[Full GC (Ergonomics) [PSYoungGen: 940K->428K(1024K)] [ParOldGen: 480K->481K(512K)] 1421K->909K(1536K), [Metaspace: 3405K->3405K(1056768K)], 0.0071489 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[Full GC (Ergonomics) [PSYoungGen: 604K->599K(1024K)] [ParOldGen: 481K->481K(512K)] 1085K->1080K(1536K), [Metaspace: 3405K->3405K(1056768K)], 0.0113774 secs] [Times: user=0.05 sys=0.00, real=0.01 secs] 
[Full GC (Allocation Failure) [PSYoungGen: 599K->599K(1024K)] [ParOldGen: 481K->481K(512K)] 1080K->1080K(1536K), [Metaspace: 3405K->3405K(1056768K)], 0.0066770 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
Heap
 PSYoungGen      total 1024K, used 649K [0x00000000ffe80000, 0x0000000100000000, 0x0000000100000000)
  eden space 512K, 43% used [0x00000000ffe80000,0x00000000ffeb71a8,0x00000000fff00000)
  from space 512K, 83% used [0x00000000fff80000,0x00000000fffeb2f8,0x0000000100000000)
  to   space 512K, 0% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff80000)
 ParOldGen       total 512K, used 481K [0x00000000ffe00000, 0x00000000ffe80000, 0x00000000ffe80000)
  object space 512K, 93% used [0x00000000ffe00000,0x00000000ffe78488,0x00000000ffe80000)
 Metaspace       used 3436K, capacity 4556K, committed 4864K, reserved 1056768K
  class space    used 370K, capacity 392K, committed 512K, reserved 1048576K
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOf(Arrays.java:3332)
	at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
	at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
	at java.lang.StringBuilder.append(StringBuilder.java:136)
	at com.jd.qsm.first.demo.controller.DemoClass.main(DemoClass.java:8)
Disconnected from the target VM, address: '127.0.0.1:51561', transport: 'socket'

回答第一个问题,由于我们一直生成的是字符串,最终导致OOM的原因是Java heap space堆空间,而在生成字符串时Metaspace几乎就没有什么变化过。所以证明字符串常量池在堆空间中。

回答第二个问题,可以看到程序经历了很多次的GC和fullGC,看到新生代和老年代的内存占用都有减少,最终由于堆内存不足才OOM的。所以由于每次GC都有减少,所以字符串是可以被GC回收的。


4、常量池怎么查看。
5、常量池有什么作用,为什么需要它
6、常量池与运行时常量池有什么关联

回答4-6问题
编写一段代码

public class DemoClass {
    public static void main(String[] args) throws Exception {
        System.out.println("qsm");
    }
}

找到字节码文件,运行javap -v DemoClass.class

D:\idea\code\firstdemo\target\classes\com\jd\qsm\first\demo\controller>javap -v DemoClass.class
Classfile /D:/idea/code/firstdemo/target/classes/com/jd/qsm/first/demo/controller/DemoClass.class
  Last modified 2021-1-9; size 666 bytes
  MD5 checksum 711ba65168cdd7d23241623fe88153f6
  Compiled from "DemoClass.java"
public class com.jd.qsm.first.demo.controller.DemoClass
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #6.#23         // java/lang/Object."<init>":()V
   #2 = Fieldref           #24.#25        // java/lang/System.out:Ljava/io/PrintStream;
   #3 = String             #26            // qsm
   #4 = Methodref          #27.#28        // java/io/PrintStream.println:(Ljava/lang/String;)V
   #5 = Class              #29            // com/jd/qsm/first/demo/controller/DemoClass
   #6 = Class              #30            // java/lang/Object
   #7 = Utf8               <init>
   #8 = Utf8               ()V
   #9 = Utf8               Code
  #10 = Utf8               LineNumberTable
  #11 = Utf8               LocalVariableTable
  #12 = Utf8               this
  #13 = Utf8               Lcom/jd/qsm/first/demo/controller/DemoClass;
  #14 = Utf8               main
  #15 = Utf8               ([Ljava/lang/String;)V
  #16 = Utf8               args
  #17 = Utf8               [Ljava/lang/String;
  #18 = Utf8               Exceptions
  #19 = Class              #31            // java/lang/Exception
  #20 = Utf8               MethodParameters
  #21 = Utf8               SourceFile
  #22 = Utf8               DemoClass.java
  #23 = NameAndType        #7:#8          // "<init>":()V
  #24 = Class              #32            // java/lang/System
  #25 = NameAndType        #33:#34        // out:Ljava/io/PrintStream;
  #26 = Utf8               qsm
  #27 = Class              #35            // java/io/PrintStream
  #28 = NameAndType        #36:#37        // println:(Ljava/lang/String;)V
  #29 = Utf8               com/jd/qsm/first/demo/controller/DemoClass
  #30 = Utf8               java/lang/Object
  #31 = Utf8               java/lang/Exception
  #32 = Utf8               java/lang/System
  #33 = Utf8               out
  #34 = Utf8               Ljava/io/PrintStream;
  #35 = Utf8               java/io/PrintStream
  #36 = Utf8               println
  #37 = Utf8               (Ljava/lang/String;)V
{
  public com.jd.qsm.first.demo.controller.DemoClass();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 3: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Lcom/jd/qsm/first/demo/controller/DemoClass;

  public static void main(java.lang.String[]) throws java.lang.Exception;
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=1, args_size=1
         0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
         3: ldc           #3                  // String qsm
         5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         8: return
      LineNumberTable:
        line 5: 0
        line 6: 8
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       9     0  args   [Ljava/lang/String;
    Exceptions:
      throws java.lang.Exception
    MethodParameters:
      Name                           Flags
      args
}
SourceFile: "DemoClass.java"

从的出来的结果可以看到有一部分叫做Constant pool:,这里就是class文件常量池,是编译之后生成的,是一个静态的概念。它包含了字面量和符号引用。比如

		 0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
         3: ldc           #3                  // String qsm
         5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         8: return

比如ldc指令指向了#3,而#3在常量池中,指的是#3 = String #26 // qsm#26指的是#26 = Utf8 qsm,也就是说这里的#3就是符号引用。这些符号引用到加载到jvm(解析阶段)或者运行时(虚拟机栈的动态链接),才会变成直接引用。

问题4的答案,使用javap -v xxx.class命令就可以查看到常量池。

问题5的答案,一个类编译为字节码中,肯定是需要了很多其他的类,比如本代码就需要了System,Object等类信息,这些数据很大,不可能全部放在一个类的字节码文件中,所以先使用常量池,对这些数据的引用使用符号引用,等真正加载到jvm或者运行时才将这些符号引用转换为直接引用。

问题6、当类加载到内存中后,jvm就会将class常量池中的内容存放到运行时常量池中了。但是jdk1.8把其中的字符串常量池放入了jvm中。


7、什么叫符号引用,什么叫直接引用
8、什么地方进行了符号引用转换为直接引用
8、什么叫静态链接和动态链接

还是上面的javap解析出来的的字节码文件为例

		 0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
         3: ldc           #3                  // String qsm
         5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         8: return

0: getstatic #2,第一句getstatic得到静态属性,里面的#2就是符号引用,在常量池中它又指向了其他符号引用,但最终实际代表了PrintStream类的一个对象。这些符号引用在编译的时候,仅仅是表面自己需要什么,到加载jvm或者运行时才执行真正的地址,这个就是直接引用了。

jvm加载的时候有一个阶段叫做解析,这里就把能够确定的符号引用转变为直接引用了。这里的解析也成为静态链接。还有一个地方,线程的虚拟机栈执行方法的时候,有一个动态链接,这个地方也是将符号引用转为直接引用的,由于是在运行中,所以叫做动态链接。

那么什么情况下使用静态链接,什么情况使用动态链接。一般静态链接的时候,都是能够直接确定地址的,比如类的静态方法,final方法,private方法,构造器等,这些都叫做非虚方法。
而一般的public void hi();等成员方法就是虚方法。这些在加载的时候,是无法确定的。只有正运行的时候才知道。主要原因还是多态(重写)因素。
比如,Father person= new SonA();,执行person.hi()的时候,是不知道这个hi方法具体是执行谁的,是SonA的还是Father的,并不清楚SonA是否重写了父类的hi方法。所以这里只有真正运行方法的时候,才知道才符号引用指向直接引用。
再看5: invokevirtual #4,invokevirtual 就是调用虚方法,它下面还有子类。
在这里插入图片描述

【完,喜欢就点个赞呗】

正在去BAT的路上修行

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

简单理解常量、常量池、运行时常量池和字符串常量池 的相关文章

  • CATALINA_OPTS 与 JAVA_OPTS - 有什么区别?

    我试图找出 Apache Tomcat 变量之间的区别 CATALINA OPTS and JAVA OPTS in SO http stackoverflow com并惊讶地发现这里还没有发布问题 答案 所以我想在发现差异后在这里分享 带
  • Java动态澄清

    我在术语下看到了这段摘录Java 流行语在读一本关于Java的书时我不明白 Dynamic Java 程序带有大量的运行时类型信息 用于在运行时验证和解析对对象的访问 这使得以安全且方便的方式动态链接代码成为可能 这对于 Java 环境的稳
  • 运行JDK代码时Java JIT会作弊吗?

    我正在对一些代码进行基准测试 但我无法让它运行得像java math BigInteger https docs oracle com javase 7 docs api java math BigInteger html 即使使用完全相同
  • 有什么方法可以显示正在运行的 JVM 中使用的标志吗?

    尽管我们已经为应用程序显式设置了许多 JVM 标志 但很难知道是否 1 布尔标志默认已打开 默认值在 JDK JRE 次要更新之间发生了变化 2 一个标志否定另一个标志 3 特定系统上给定任意标志的默认值是什么 由 Java 人体工程学设置
  • JVM 内存类型

    我正在做一个监控项目 我们有监控软件正在运行并从服务器重新收集指标 一切工作正常 但我们需要一些有关 JVM 内存使用情况详细信息 我们有一些具有不同内存类型的列 我们需要知道这些是什么 Heap Non Heap Usage Peak C
  • IntelliJ 调试:暂停整个虚拟机,然后进入单线程

    我正在调试一个具有大量线程的应用程序 我的断点设置为暂停整个虚拟机 当线程遇到其中一个断点时 我想使用 Step Over 但这似乎会恢复整个虚拟机 直到该步骤完成 如果我可以只单步执行到达断点的单个线程 那确实会有帮助 在 Intelli
  • 如果只有完全限定名称,如何获取 java 类的二进制名称?

    反射类和方法以及类加载器等需要使用所谓的 二进制 类名称 问题是 如果只有完全限定名称 即在源代码中使用的名称 如何获得二进制名称 例如 package frege public static class RT public static
  • 如何使用IntelliJ IDEA ThreadDumpVisualizer插件分析Java线程转储

    我正在寻找使用一些线程转储分析器来分析 Java 线程转储并安装了ThreadDumpVisualizerIntelliJ IDEA 插件 但不知道如何使用它 插件页面 https plugins jetbrains com plugin
  • 以编程方式设置最大 Java 堆大小

    有没有办法以编程方式设置最大 java 堆大小而不是作为 vm 参数 就像是 System getProperties put
  • getResourceAsStream(file) 在哪里搜索文件?

    我很困惑getResourceAsStream 我的包结构如下 src net floodlightcontroller invoked getResourceAsStream here resources floodlightdefaul
  • 集群环境下的Spring Singleton

    正如中所讨论的this https stackoverflow com questions 1194129 singleton in cluster environmentpost 不适合使用单例聚集的环境 因为不同 JVM 中有多个单例对
  • 一个好的 Java VM 中方法调用的开销是多少?

    有人可以提供反汇编的机器代码汇编程序列表吗 我的意思是 与 C 中的普通函数调用相比 肯定有一些开销 VM 需要跟踪调用以查找热点 并且当它使用编译代码时 如果新加载的类需要重新编译 它需要提供动态更改编译方法的方法 我想某处也有返回堆栈溢
  • Scala 中的多个类型下限

    我注意到tuple productIterator总是返回一个Iterator Any 想知道是否无法设置多个下限 因此它可能是最低公共超类型的迭代器 我尝试并搜索了一下 但只发现this https stackoverflow com q
  • 为什么 MetaSpace 大小是已用 MetaSpace 的两倍?

    我写了一个程序来模拟MetaSpace OOM 但我发现MetaSpace Size几乎总是两倍大Used MetaSpace Why 我用标志运行我的程序 XX MaxMetaspaceSize 50m 程序抛出OOM时Used Meta
  • jvm 如何以及何时何地更改 Linux 的最大打开文件值?

    在linux中 每个登录用户的每个进程的最大打开文件数有限制 如下所示 ulimit n 1024 当我学习java nio时 我想检查这个值 因为channel在Linux中也是一个文件 所以我编写了一个客户端代码来不断创建socketC
  • 监控 Java 应用程序上的锁争用

    我正在尝试创建一个小基准 在 Groovy 中 以显示几个同步方法上的高线程争用 当监控自愿上下文切换时 应该会出现高争用 在 Linux 中 这可以通过 pidstat 来实现 程序如下 class Res private int n s
  • Scala REPL 中的递归重载语义 - JVM 语言

    使用 Scala 的命令行 REPL def foo x Int Unit def foo x String Unit println foo 2 gives error type mismatch found Int 2 required
  • Java 中清除嵌套 Map 的好方法

    public class MyCache AbstractMap
  • 通过SOCKS代理连接Kafka

    我有一个在 AWS 上运行的 Kafka 集群 我想用标准连接到集群卡夫卡控制台消费者从我的应用程序服务器 应用程序服务器可以通过 SOCKS 代理访问互联网 无需身份验证 如何告诉 Kafka 客户端通过代理进行连接 我尝试了很多事情 包
  • 容器中的 JVM 计算处理器错误?

    最近我又做了一些研究 偶然发现了这一点 在向 OpenJDK 团队抱怨之前 我想看看是否有其他人观察到这一点 或者不同意我的结论 因此 众所周知 JVM 长期以来忽略了应用于 cgroup 的内存限制 众所周知 现在从 Java 8 更新某

随机推荐

  • 开源点云数据集整理汇总

    目录 一 ModelNet40 1 网址 2 模型 二 ShapeNet 1 网址 2 模型 三 S3DIS Dataset 1 网址 2 模型 四 ScanNet 1 网址 2 模型 五 RGB D Object Dataset 1 网址
  • 麻雀算法极限学习机SSA-ELM回归预测及其MATLAB代码实现

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab仿真内容点击 智能优化算法 神经网络预测 雷达通信 无线传感器 信号处理 图像
  • 哈希 学习笔记

    Tips Hash 哈希 散列 Tips 哈希经常与哈希函数指一个意思 本文中哈希与哈希函数不做特殊区分 默认就是一个意思 什么是哈希 在记录的关键字与记录的存储地址之间建立的一种对应关系叫哈希函数 哈希函数就是一种映射 是从关键字到存储地
  • AI笔记(1)

    回归与分类 回归 在数学表示 数值是一个连续性的 要预测的一个值 回归分析是一种预测性的建模技术 它研究的是因变量和自变量之家的关系 这种技术通常用于预测分析 通过使用直线或曲线来拟合数据点 目标是使曲线到数据点的距离差异最小 分类 分类模
  • python重新加载某方法

    20221014 引言 我记得 在很久之前我就弄过这部分内容 当时也是在jupyter notebook中进行实验 然后在这个过程中 需要重新加载某个方法 因为在实验过程中 修改了这个py文件中的函数 整体的思路就是这样 这次也是遇到了这个
  • nginx+ftp实现图片的上传与访问

    1 Nginx的安装 在前面的博客讲到 具体见下面的网址 Nginx的安装 http blog csdn net zbw18297786698 article details 52556293 2 Linux安装ftp组件 2 1 安装vs
  • 随e行创建L2TP 809 错误【一键脚本】

    请下载下面的文件 809 repair zip 右键点击 809 repaire bat 文件 以管理员身份运行 选择 是 根据提示 输入对应字符 yes 以完成对注册表的修改 等待脚本完成对注册表和服务的更改 按任意键退出窗口 809错误
  • LeetCode 热题 HOT 100:链表专题

    LeetCode 热题 HOT 100 https leetcode cn problem list 2cktkvj 文章目录 2 两数相加 19 删除链表的倒数第 N 个结点 21 合并两个有序链表 23 合并 K 个升序链表 141 环
  • windows服务器修改SSL证书友好名称

    系统环境 操作系统 windows 2016 web服务器 IIS 10 修改原因 阿里云上创建的免费证书 友好名称均为alias 在一些集成环境中操作绑定对应站点的SSL证书的时候 可能会因为证书友好名称相同 而找不到对应的SSL证书 操
  • UNIAPP保存base64图片

    制作APP分享二维码 后端生成base64图片 需要前端保存到相册 上代码 saveImgFile base64 base64为base64图片值 const bitmap new plus nativeObj Bitmap test bi
  • Kotlin快速入门

    kotlin kotlin 完全兼容 java 可以和java互相调用 2017年谷歌正式将其作为android开发的第一语言 kotlin编译后产生与java编译后相同的class字节码文件 基础语法 第一个代码 hello world
  • Method的invoke()方法的使用

    public Object invoke Object obj Object args throws IllegalAccessException IllegalArgumentException InvocationTargetExcep
  • idea插件开发入门

    前言 最近想研究一款自动在idea中定位缺陷及发送JIRA的快捷工具 方便提升报自动化脚本的bug的效率 因为idea插件学习是必不可少了 沉淀小结如下 idea插件开发入门 插件用途 工程创建 配置文件 Action实现 开发语法 常用对
  • js三种获取数组的最后一个元素的方法

    一 pop 方法 pop 方法 删除数组最后一个元素 并返回该元素 所以利用这个方法可以取到数组的最后一个 同理shift 可以取到数组的第一个元素 shift 删除数组第一个元素 并返回该元素 let arr 1 2 3 let ele
  • css background image size,html - css background image content size - Stack Overflow

    body margin 0 height 100vh top box text align center height 20 border 1px solid blue background red two area display inl
  • https http 重定向 302 303

    笔者在项目中曾经遇到过这样的情况 就是整个web应用使用的https协议 但是其中某一个表单提交单服务器端 服务器返回了一个重定向的响应 但是此时浏览器直接被拦截 没有做重定向处理 F12打开一看 是因为在https的请求中 混杂着http
  • 解决docker下载安装速度慢的问题

    1 进入etc docker 目录 root iZwz98nzsodcbigjqrrmxmZ cd etc docker 2 在该目录下新建daemon json文件 registry mirrors https docker mirror
  • git 查看远程分支在不同的终端看到的分支不同的解决方法

    多人协作开发的时候 有时候有很多分支 并且在有些分支在a电脑删除之后 在b电脑查看当前分支 居然还有那个被删除掉了的分支 git fetch prune origin 直接执行这行代码 之后再查看一下远程分支 git branch a a
  • SpringBoot在K8s下实现优雅停机

    在K8s中 当我们实现滚动升级之前 务必要实现应用级别的优雅停机 否则滚动升级时 还是会影响到业务 本文介绍SpringBoot应用实现优雅停机 此次教程基于SpringBoot 2 5 0 1 加入必要依赖
  • 简单理解常量、常量池、运行时常量池和字符串常量池

    1 常量 常量在java中就值的是一般的字面量 比如字符串 整数 浮点数等等数据 简单理解java中什么叫常量 2 常量池 也叫静态常量池或者class文件常量池 说常量池一定要指明是编译器产生的 它的组成为字面量和符号引用 3 运行时常量