JVM内存结构及内存溢出OOM

news2024/9/21 14:34:33

JVM内存结构

JVM的内存结构大致分为五个部分,分别是程序计数器、虚拟机栈、本地方法栈、堆和方法区。除此之外,还有由堆中引用的JVM外的直接内存。

下面将展开讲解这五个部分。

程序计数器

程序计数器(Program Counter Register),用于记录下一条JVM指令的执行地址(如果正在执行的是本地方法则为空)。例如下图中的JVM指令,当我执行到地址为0的指令时,程序计数器就会存下下一条指令的地址,也就是地址3。

要注意的是,程序计数器时线程私有的,每一个线程都有一个程序计数器,只有这么设计,当CPU因为时间片轮转等原因切换线程的时候,才能保存当前线程的执行进度。

Java 虚拟机可以同时支持多个执行线程。每个 Java 线程都有自己的 pc(程序计数器)寄存器。在任何时候,每个 Java线程都在执行单个方法的代码,即该线程的当前方法 。如果该方法不是本机方法,则 pc 寄存器包含当前正在执行的 Java 虚拟机指令的地址。如果线程当前正在执行的方法是native,那么Java虚拟机的pc寄存器的值是undefined。 Java 虚拟机的 pc 寄存器足够宽,可以容纳 returnAddress 或特定平台上的本机指针。

同时,程序计数器不会存在内存溢出,此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

虚拟机栈

每个 Java 线程都有一个私有的 Java 虚拟机栈(Java Virtual Machine Stack),其生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个栈由多个栈帧(Frame)组成,每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、常量池引用、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

可以通过 -Xss 这个虚拟机参数来指定每个线程的 Java 虚拟机栈内存大小,在 JDK 1.4 中默认为 256K,而在 JDK 1.5+ 默认为 1M:

java -Xss2M HackTheJava

JVM规范允许虚拟机栈具有固定大小或根据计算需要动态扩展和收缩。Java虚拟机规范中,对这个区域规定了两种异常状况:

  1. 如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常,这种异常在无停止条件的递归情况下会发生;

  1. 如果虚拟机栈可以动态扩展(当前大部分的Java虚拟机都可动态扩展,只不过Java虚拟机规范中也允许固定长度的虚拟机栈),如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。

本地方法栈

本地方法栈(Native Method Stack)与虚拟机栈所发挥的作用是非常相似的,它们之间的区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的本地(Native)方法服务。

与虚拟机栈一样,本地方法栈区域也会抛出StackOverflowError和OutOfMemoryError异常。

本地方法一般是用其它语言(C、C++ 或汇编语言等)编写的,并且被编译为基于本机硬件和操作系统的程序,对待这些方法需要特别处理。

Java堆(Heap)是被所有线程共享的一块内存区域,在虚拟机启动时创建。几乎所有的对象实例和数组都在这里进行分配,是垃圾收集的主要区域(“GC 堆”)。

堆在实现时,可以是固定大小的,也可以时根据需要动态扩展的。堆的内存不需要是连续的。如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。

现代的垃圾收集器基本都是采用分代收集算法,其主要的思想是针对不同类型的对象采取不同的垃圾回收算法。可以将堆分成两块:

新生代(Young Generation)
老年代(Old Generation)

可以通过 -Xms 和 -Xmx 这两个虚拟机参数来指定一个程序的堆内存大小,第一个参数设置初始值,第二个参数设置最大值。

java -Xms1M -Xmx2M HackTheJava

方法区

方法区(Method Area)也是被所有线程共享的内存区域。它存储每个类的结构,存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码,以及方法和构造函数的代码,包括类和实例初始化以及接口初始化中使用的特殊方法。

和堆一样不需要连续的内存,并且可以动态扩展,如果方法区中的内存无法满足分配请求,一样会抛出 OutOfMemoryError 异常。

对这块区域进行垃圾回收的主要目标是对常量池的回收和对类的卸载,但是一般比较难实现。

HotSpot 虚拟机把它当成永久代来进行垃圾回收。但很难确定永久代的大小,因为它受到很多因素影响,并且每次 Full GC 之后永久代的大小都会改变,所以经常会抛出 OutOfMemoryError 异常。为了更容易管理方法区,从 JDK 1.8 开始,移除永久代,并把方法区移至元空间,它位于本地内存中,而不是虚拟机内存中。

方法区是一个 JVM 规范,永久代与元空间都是其一种实现方式。在 JDK 1.8 之后,原来永久代的数据被分到了堆和元空间中。元空间存储类的元信息,静态变量和字符串常量池等放入堆中。

JDK1.6及以前

JDK1.7

JDK1.8

运行时常量池

运行时常量池(Runtime Constant Pool)是方法区的一部分。

常量池,就是一张表,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等信息。

运行时常量池,常量池是 *.class 文件中的,当该类被加载,它的常量池信息就会放入运行时常量池,并把里面的符号地址变为真实地址。

除了在编译期生成的常量,还允许动态生成,例如 String 类的 intern()。

例如下图,就是main函数进行System.out.println(“hello world”)时的JVM指令和运行时常量池。JVM指令后面的“#”地址对应着常量池里的类名、方法引用、字面量等的地址,从而成功执行指令。

字符串常量池

字符串常量池在1.6版本前放在方法区中,在1.7版本后放到了堆中。

  • 常量池中的字符串仅是符号,第一次用到时才变为对象

  • 利用串池的机制,来避免重复创建字符串对象

  • 字符串变量拼接的原理是StringBuilder (1.8)

  • 字符串常量拼接的原理是编译期优化

  • 可以使用 intern方法,主动将串池中还没有的字符串对象放入串池

1.8 将这个字符串对象尝试放入串池,如果有则并不会放入,如果没有则放入串池, 会把串池中的对象返回
1.6 将这个字符串对象尝试放入串池,如果有则并不会放入,如果没有会把此对象复制一份, 放入串池,会把串池中的对象返回

直接内存

在 JDK 1.4 中新引入了 NIO 类,它可以使用 Native 函数库直接分配堆外内存,然后通过 Java 堆里的 DirectByteBuffer 对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在堆内存和堆外内存来回拷贝数据。

OOM的类型

StackOverflowError

示例代码

-Xss256k
public class Demo1 {

    private final AtomicInteger num = new AtomicInteger();

    public static void main(String[] args) {
        Demo1 demo1 = new Demo1();
        try {
            demo1.stackOverflow();
        } catch (Error e) {
            System.out.println("num = " + demo1.num.get());
            throw e;
        }
    }

    private void stackOverflow() {
        num.getAndIncrement();
        stackOverflow();
    }
}

错误信息

Exception in thread "main" java.lang.StackOverflowError
    at com.cloudwise.demo.gc.Demo1.stackOverflow(Demo1.java:30)
    at com.cloudwise.demo.gc.Demo1.stackOverflow(Demo1.java:30)
    at com.cloudwise.demo.gc.Demo1.stackOverflow(Demo1.java:30)

解决方案

  • 检查堆栈跟踪

仔细检查错误堆栈,并查找问题代码行号,从本例来看,明显是由错误的递归调用(Demo1.java:30)引起的。确定问题代码后,通过指定适当的终止条件来修复。

  • 加大线程空间(-Xss)

如果优化过的程序仍然抛出StackOverflowError,则可以增加线程堆栈大小以允许更深的程序调用。

OutOfMemoryError: unable to create new native thread

示例代码

-Xss1m
-Xms30m
-Xmx50m
public class Demo2 {

    public static void main(String[] args) {
        int count = 0;
        while (true) {
            new Thread(() -> {
                try {
                    TimeUnit.HOURS.sleep(1L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }, "t-" + count++).start();
        }
    }
}

错误信息

Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Thread.java:717)
    at com.cloudwise.demo.gc.Demo2.main(Demo2.java:21)

解决方案

  • 在操作系统级别增加线程数限制(不推荐)

  • 使用线程池,具体标准可参考阿里巴巴Java开发手册第一章第7节并发处理。

  • 谨慎使用线程池,及设置线程池参数,禁止无节制的创建线程

  • 设置有意义的线程名称,方便问题回溯

OutOfMemoryError: Java heap space

示例代码

-Xms30m
-Xmx30m
-XX:+PrintGCDetails
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/Users/adams/Downloads/gc/demo3.hprof
public class Demo3 {
    static int _1M= 1024 * 1024;

    public static void main(String[] args) {

        ArrayList<BigObj> list = new ArrayList<>();
        for (int i = 0; i < 10_000; i++) {
            list.add(new BigObj(_1M));
        }
    }
    /**
     * 每个对象申请1MB内存
     */
    private static class BigObj {
        private final byte[] bytes;
        public BigObj(int length) {
            this.bytes = new byte[length];
        }
    }
}

错误信息

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at com.cloudwise.demo.gc.Demo3$BigObj.<init>(Demo3.java:17)
    at com.cloudwise.demo.gc.Demo3.main(Demo3.java:8)

解决方案

  • 增加jvm分配内存(简单直接)

  • 分析jvm堆快照,查找内存占用大的对象分布。定位到自定义对象后开始分析,

OutOfMemoryError: Metaspace / PermGen space

示例代码

-Xms30m
-Xmx30m
-XX:+PrintGCDetails
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/Users/adams/Downloads/gc/demo4.hprof
-XX:MetaspaceSize=10m
-XX:MaxMetaspaceSize=10m
public class Demo4 {
    public static void main(String[] args) {
        while (true) {
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(OomObj.class);
            enhancer.setUseCache(false);
            enhancer.setCallback((MethodInterceptor) (obj, method, args1, proxy) -> proxy.invoke(obj, args1));
            enhancer.create();
        }
    }
    private static class OomObj {
        public OomObj() {
        }
    }
}

错误信息

jvisualvm演示

Heap
 PSYoungGen      total 9216K, used 326K [0x00000007fee00000, 0x00000007ff800000, 0x00000007ff800000)
  eden space 8192K, 3% used [0x00000007fee00000,0x00000007fee51a18,0x00000007ff600000)
  from space 1024K, 0% used [0x00000007ff700000,0x00000007ff700000,0x00000007ff800000)
  to   space 1024K, 0% used [0x00000007ff600000,0x00000007ff600000,0x00000007ff700000)
 ParOldGen       total 20480K, used 2708K [0x00000007fda00000, 0x00000007fee00000, 0x00000007fee00000)
  object space 20480K, 13% used [0x00000007fda00000,0x00000007fdca5368,0x00000007fee00000)
 Metaspace       used 15206K, capacity 15300K, committed 15360K, reserved 1062912K
  class space    used 1313K, capacity 1364K, committed 1408K, reserved 1048576K
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at net.sf.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:459)
    at net.sf.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:339)
    ... 6 more
Caused by: java.lang.OutOfMemoryError: Metaspace
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
    ... 11 more

解决方案

因为该 OOM 原因比较简单(动态代理、jsp、脚本引擎编译等),解决方法有如下几种:

  1. 检查是否永久代空间或者元空间设置的过小,建议将MetaspaceSize和MaxMetaspaceSize设置成相同大小

  1. 检查代码中是否存在大量的反射操作

  1. dump之后通过mat检查是否存在大量由于反射生成的代理类

  1. 放大招,重启JVM

OutOfMemoryError: Direct buffer memory

示例代码

-Xms30m
-Xmx30m
-XX:+PrintGCDetails
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/Users/adams/Downloads/gc/demo5.hprof
-XX:MaxDirectMemorySize=10m
public class Demo5 {
    private static final int _1M= 1 << 20;

    public static void main(String[] args) {
        List<ByteBuffer> byteBuffers = new LinkedList<>();
        while (true) {
            ByteBuffer byteBuffer = ByteBuffer.allocateDirect(_1M);
            byteBuffers.add(byteBuffer);
        }
    }
}

错误信息

Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memory
        at java.nio.Bits.reserveMemory(Bits.java:695)
        at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123)
        at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311)
        at com.cloudwise.demo.gc.Demo5.main(Demo5.java:18)
Heap
 PSYoungGen      total 9216K, used 411K [0x00000007bf600000, 0x00000007c0000000, 0x00000007c0000000)
  eden space 8192K, 5% used [0x00000007bf600000,0x00000007bf666e38,0x00000007bfe00000)
  from space 1024K, 0% used [0x00000007bfe00000,0x00000007bfe00000,0x00000007bff00000)
  to   space 1024K, 0% used [0x00000007bff00000,0x00000007bff00000,0x00000007c0000000)
 ParOldGen       total 20480K, used 405K [0x00000007be200000, 0x00000007bf600000, 0x00000007bf600000)
  object space 20480K, 1% used [0x00000007be200000,0x00000007be265728,0x00000007bf600000)
 Metaspace       used 3347K, capacity 4496K, committed 4864K, reserved 1056768K
  class space    used 372K, capacity 388K, committed 512K, reserved 1048576K

解决方案

其dump文件有一个明显特点,就是文件很小,从dump文件中看不到明显的异常。如果项目中直接或间接的使用的NIO,可以考虑一下是不是这方面的原因。

java.lang.OutOfMemoryError:GC overhead limit exceeded

示例代码

-Xms30m
-Xmx30m
-XX:+PrintGCDetails
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/Users/adams/Downloads/gc/demo6.hprof
-XX:+UseParallelGC
public class Demo6 {
    public static void main(String[] args) {
        int i = 0;
        List<String> list = new ArrayList<>();
        try {
            while (true) {
                list.add(String.valueOf(i++).intern());
            }
        } catch (Throwable t) {
            System.out.println("i = " + i);
            t.printStackTrace();
            throw t;
        }
    }
}

错误信息

java.lang.OutOfMemoryError: GC overhead limit exceeded
    at java.lang.Integer.toString(Integer.java:403)
    at java.lang.String.valueOf(String.java:3099)
    at com.cloudwise.demo.gc.Demo6.main(Demo6.java:22)
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
    at java.lang.Integer.toString(Integer.java:403)
    at java.lang.String.valueOf(String.java:3099)
    at com.cloudwise.demo.gc.Demo6.main(Demo6.java:22)

解决方案

这个是JDK6新加的错误类型,一般都是堆太小导致的。Sun 官方对此的定义:超过98%的时间用来做GC并且回收了不到2%的堆内存时会抛出此异常。

  1. 检查项目中是否有大量的死循环或有使用大内存的代码,优化代码。

  1. 添加参数 -XX:-UseGCOverheadLimit 禁用这个检查,其实这个参数解决不了内存问题,只是把错误的信息延后,最终出现 java.lang.OutOfMemoryError: Java heap space。

  1. dump内存,检查是否存在内存泄露,如果没有,加大内存。

其他不常见OOM类型

  • java.lang.OutOfMemoryError: Requested array size exceeds VM limit:分配超大数组

  • java.lang.OutOfMemoryError: Out of swap space:swap溢出

  • java.lang.OutOfMemoryError: stack_trace_with_native_method:本地方法溢出

排查思路

  1. 获取heapdump文件

-XX:+HeapDumpOnOutOfMemoryError或jmap -dump:format=b,file=xxx.hprof <pid>

  1. 从日志或者dump文件中分析发生OOM的内存区域

  1. 分析内存对象,是否发生内存泄漏。分析问题对象到GC roots的引用关系,判断是否因为错误的对象生命周期引起。如果是,则优化代码(软引用等)。

  1. 调整对应的jvm参数,如加大内存、调整GC算法等

参考资料

手把手教你了解OOM | HeapDump性能社区

性能专题 | 由浅入深了解GC原理 | HeapDump性能社区

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

券商接口关闭的情况下怎么做到实时量化买入?通达信破解接口可以吗?

现在券商接口关闭的情况下怎么做到实时量化买入&#xff1f;量化买入有一些第三方软件是可以破解券商接口的。像通达信破解接口它有一个什么机构版还是什么&#xff0c;他可以同时几个券商一起买入&#xff0c;当然这个你需要用手工输入。像其他的像一些A计划&#xff0c;它就是…

【 java 集合】List接口常用实现类对比以及ArrayList和LinkedList源码分析

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

绿控传动冲刺科创板上市:连年亏损,现金流紧张,计划募资11亿元

近日&#xff0c;苏州绿控传动科技股份有限公司&#xff08;下称“绿控传动”&#xff09;在上海证券交易所递交招股书&#xff0c;准备在科创板上市。 本次冲刺上市&#xff0c;绿控传动计划募资10.72亿元&#xff0c;其中7.16亿元用于年产新能源商用车电驱动系统10万套项目&a…

泛微特色政务应用:对内协同办公、对外高效服务,推动政务数字化

近年来&#xff0c;国家不断深入建设“数字化政府”&#xff0c;政务服务“网上办”、“掌上办”、“一网通办”已经成为政务服务新方向。 泛微数字化运营平台为各级政府机关、行政事业单位&#xff0c;打造覆盖各级市、区、县、乡镇街道、村及各级社区部门的网上协同办公平台…

Qt编译CTK

文章目录一、CTK简介二、CTK下载三、CTK编译一、CTK简介 CTK是什么 CTK 为支持生物医学图像计算的公共开发包&#xff0c;其全称为 Common Toolkit CTK 提供了什么 当前&#xff0c;CTK 工作的主要范围包括&#xff1a; DICOM&#xff1a;提供了从 PACS 和本地数据库中查询和…

基础数据结构——链表

目录 一、链表 1、数组的缺点 2、链表 3、单向链表 4、双向链表 5、Python链表的实现 二、例题 一、链表 1、数组的缺点 1&#xff09;需要占用连续的空间 若某个数组很大&#xff0c;可能没有这么大的连续空间给它用。 2&#xff09;不方便删除和插入 例如删除数组…

MySQL如何查看未提交的事务SQL

点击上方蓝字关注我MySQL中经常遇到事务中的SQL正在执行或执行完成后未提交&#xff0c;如何找出对应的SQL&#xff1f;1. 查看正在执行的SQL查看事务中正在执行的SQL方式有多种&#xff0c;例如1.1 通过processlist查看会话1&#xff1a;执行1个SQLmysql> begin; Query OK…

AC7811-BLDC无感控制代码调试与测试记录

接线注意 供电 对于 AC781x 电机 Demo 板&#xff0c;其 MCU 控制板和功率板的 12V 输入只需接一路即可&#xff0c;如果电机额定电压为 12V&#xff0c;那么将功率板中的功率管供电模式选择跳点(靠近 D5)短接即可&#xff0c;不需要再额外供电&#xff1b;如果电机的额定电压…

配置磁盘多路径聚合

一 安装多路径软件 yum install -y device-mapper device-mapper-multipath 二 配置多路径聚合 在每个节点上都需要配置下多路径聚合。 /* 注意事项&#xff1a; 新添加盘后要扫描下&#xff0c;才能识别到(如果已经看到盘了&#xff0c;即执行multipath -ll能看到&#…

《收获,不止Oracle》读书笔记之性能提升千倍

体系学习让SQL语句性能提升千倍 未优化前&#xff0c;单车速度 drop table t purge; create table t(x int);create or replace procedure proc1 as beginfor i in 1..100000loopexecute immediateinsert into t values (||i||);commit;end loop; end; / /*这里要记得预先执行…

linux下常用调试技巧

1 linux下如何查看静态库和动态库都链接了那些库 1.1 静态库.a是没有指令可以看到其在生成过程中链接了那些库的 1.2 动态库.so可以通过ldd指令查看其在生成过程中链接了那些库 还有一种简单直观的方法,我们可以在编译过程中看到所生成的二进制文件,链接了那些库: 平时编译…

[阶段4 企业开发进阶] 7. 微服务--SpringCloud Alibaba

文章目录1 服务注册和配置中心Nacos1.1 Nacos简介1.2 Nacos作为服务注册中心服务提供者注册服务消费者注册和负载服务注册中心对比1.3 Nacos作为服务配置中心基础配置分类配置DataID方案配置Group方案配置Namespace方案配置1.4 Nacos集群和持久化配置2 服务熔断和限流SentinelS…

指针仪表读数识别系统 yolov7

指针仪表读数识别系统通过 yolov7opencv计算机视觉分析技术,利用现场摄像头可以自动识别指针型仪表读数并将读数回传给平台节省人工巡检读表的时间。YOLOv7 在 5 FPS 到 160 FPS 范围内&#xff0c;速度和精度都超过了所有已知的目标检测器&#xff0c;并在V100 上&#xff0c;…

【日常系列】LeetCode《24·贪心1》

数据规模->时间复杂度 <10^4 &#x1f62e;(n^2) <10^7:o(nlogn) <10^8:o(n) 10^8<:o(logn),o(1) 内容 lc 455 &#xff1a;分发饼干 - 贪心思想 https://leetcode.cn/problems/assign-cookies/ 提示&#xff1a; 1 < g.length < 3 * 10^4 0 < s.len…

配置双网卡聚合

一 服务器多网卡聚合的意义 1、多网卡聚合&#xff0c;可以起到网络链路冗余作用&#xff0c;当故障发生时&#xff0c;网络自动切换&#xff0c;保证业务数据不中断。 2、多网卡聚合成一条虚拟链路&#xff0c;可实现网络带宽提升&#xff0c;如2个1000Mbps的网卡聚合&#…

【收藏】使用Google Colab随时随地运行Python代码

Colab官网 什么是 Colab? Colab,或“Colaboratory”,允许您在浏览器中编写和执行 Python,不需要依赖本地资源。具有以下优势: 需要零配置免费使用GPU轻松分享几大非常方便的特性: 和Google Drive无缝融合 可以将文件存储在Google Drive里面,同时也可以从Google Driv…

TiDB性能调优

文章目录一、 TiDB 常见配置优化1.1 限制 SQL 内存使用和执行时间1.1.1 执行时间限制1.1.2 内存使用限制1.2 事务重试设置1.3 Join 算子优化1.4 常见 Mysql 兼容问题1.5 其他优化项二、TiKV优化2.1 TiKV 线程池优化2.1.1 GRPC2.1.2 Scheduler2.1.3 Raftstore2.1.4 UnifyReadPoo…

对象存储服务MinIO

1. MinIO简介 对象存储的方式对比 分布式文件系统 MinIO概述: 1.MinIO基于Apache License v2.0开源协议的对象存储服务&#xff0c;可以做为云存储的解决方案用来保存海量的图片&#xff0c;视频&#xff0c;文档。 2.Golang语言实现&#xff0c;配置简单&#xff0c;单行命令…

学习css3,使用代码实现一根心爱的二踢脚

2023春节快到了&#xff0c;虽然还在上班&#xff0c;但心情早已开始激动&#xff0c;感叹2022终将过去&#xff0c;喜迎2023兔年吧。让我以激动的心情&#xff0c;利用所学css3代码知识&#xff0c;实现一根心爱的二踢脚吧。 目录 1、实现思路 2、实现二踢脚的主体圆柱部分…

数据的存储(1)数据类型,整型在内存中的存储

TIPS 1. 函数递归必须存在限制条件。 2. 一维数组与二维数组在内存当中是连续存放的&#xff0c;二维数组的话反正也是一行一行往下走。如果能知道起始地址的话&#xff0c;后面顺藤摸瓜会很容易。 3. 数组越界的话&#xff0c;C语言本身是不做检查的。数组传参传的是数组首…