内存溢出、内存泄露的概述及常见情形

news2024/9/21 4:28:21

内存溢出(OutofMemoryError)

简述

java doc 中对 Out Of Memory Error 的解释是,没有空闲内存,并且垃圾收集器也无法提供更多内存。

JVM 提供的内存管理机制和自动垃圾回收极大的解放了用户对于内存的管理,由于 GC(垃圾回收)一直在发展,所有一般情况下,除非应用程序占用的内存增长速度非常快,造成垃圾回收已经跟不上内存消耗的速度,否则不太容易出现内存泄漏和内存溢出问题。但是基本不会出现并不等于不会出现,所以掌握 Java 内存模型原理和学会分析出现的内存溢出或内存泄漏仍然十分重要。

大多数情况下,GC 会进行各种年龄段的垃圾回收,实在不行了就放大招,来一次独占式的 Full GC 操作,这时候会回收大量的内存,供应用程序继续使用。

在抛出 OutofMemoryError 之前,通常垃圾收集器会被触发,尽其所能去清理出空间。例如:在引用机制分析中,涉及到 JVM 会去尝试回收软引用指向的对象等。在 java.nio.BIts.reserveMemory() 方法中,System.gc() 会被调用,以清理空间。

当然,也不是在任何情况下垃圾收集器都会被触发的。比如,分配了一个超大对象,类似一个超大数组超过堆的最大值,JVM 可以判断出垃圾收集并不能解决这个问题,所以直接抛出 OutofMemoryError。


内存溢出的常见情形

不同的内存溢出错误可能会发生在内存模型的不同区域,因此,需要根据出现错误的代码具体分析来找出可能导致错误发生的地方,并想办法进行解决。

  • 栈内存溢出(StackOverflowError)

    栈内存可以分为虚拟机栈(VM Stack)和本地方法栈(Native Method Stack),除了它们分别用于执行 Java 方法(字节码)和本地方法,其余部分原理是类似的。

    以虚拟机栈为例说明,Java 虚拟机栈是线程私有的,当线程中方法被调度时,虚拟机会创建用于保存局部变量表、操作数栈、动态连接和方法出口等信息的栈帧(Stack Frame)。

    具体来说,当线程执行某个方法时,JVM 会创建栈帧并压栈,此时刚压栈的栈帧就成为了当前栈帧。如果该方法进行递归调用时,JVM 每次都会将保存了当前方法数据的栈帧压栈,每次栈帧中的数据都是对当前方法数据的一份拷贝。如果递归的次数足够多,多到栈中栈帧所使用的内存超出了栈内存的最大容量,此时 JVM 就会抛出 StackOverflowError。

    总之,不论是因为栈帧太大还是栈内存太小,当新的栈帧内存无法被分配时,JVM 就会抛出 StackOverFlowError。

    优化方案:

    • 可以通过设置 JVM 启动参数 -Xss 参数来改变栈内存大小。

      注:分配给栈的内存并不是越大越好,因为栈内存越大,线程多,留给堆的空间就不多了,容易抛出OOM。JVM的默认参数一般情况没有问题(包括递归)。

    • 递归调用要控制好递归的层级,不要太高,超过栈的深度。

    • 递归调用要防止形成死循环,否则就会出现栈内存溢出。

  • 堆内存溢出(OutOfMemoryError:java heap space)

    堆内存的唯一作用就是存放数组和对象实例,即通过 new 指令创建的对象,包括数组和引用类型。

    堆内存溢出又分为两种情况:

    • Java 虚拟机的堆内存设置不够

      如果堆的大小不合理(没有显式指定 JVM 堆大小或者指定数值偏小),对象所需内存太大,创建对象时分配空间,JVM 就会抛出 OutOfMemoryError:java heap space 异常。

      优化方案:

      • 如果要处理比较可观的数据量,可以通过修改 JVM 启动参数 -Xms 、-Xmx 来调整。使用压力测试来调整这两个参数达到最优值。

      • 尽量避免大的对象的申请,例如文件上传,大批量从数据库中获取等。

        尽量分块或者分批处理,有助于系统的正常稳定的执行。

      • 尽量提高一次请求的执行速度,垃圾回收越早越好。

        否则,大量的并发来了的时候,再来新的请求就无法分配内存了,就容易造成系统的雪崩。

    • 堆内存泄露最终导致堆内存溢出

      当堆中一些对象不再被引用但垃圾回收器无法识别时,这些未使用的对象就会在堆内存空间中无限期存在,不断的堆积就会造成内存泄漏。不停的堆积最终会触发 java . lang.OutOfMemoryError。

      优化方案:如果发生了内存泄漏,则可以先找出导致泄漏发生的对象是如何被 GC ROOT 引用起来的,然后通过分析引用链找到发生泄漏的地方,进行代码优化。

  • 永久代溢出(OutOfMemoryError:PermGen sapce)

    对于老版本的 oracle JDK,因为永久代的大小是有限的,并且 JVM 对永久代垃圾回收(例如常量池回收、卸载不再需要的类型)非常不积极,所以当不断添加新类型的时候,永久代出现 OutOfMemoryError 也非常多见,尤其是在运行时存在大量动态类型生成的场合;类似 intern 字符串缓存占用太多空间,也会导致 OOM 问题,对应的异常信息,会标记出来和永久代相关:“java.lang.OutOfMemoryError:PermGen space"。

    随着元数据区的引入,方法区内存已经不再那么窘迫,所以相应的 OOM 有所改观,出现 OOM,异常信息则变成了:“java.lang.OutofMemoryError:Metaspace"。

  • 元空间内存溢出(OutOfMemoryError: Metaspace)

    元空间的溢出,系统会抛出 java.lang.OutOfMemoryError: Metaspace

    出现这个异常的问题的原因是系统的代码非常多或引用的第三方包非常多或者通过动态代码生成类加载等方法,导致元空间的内存占用很大。

    优化方案:

    • 默认情况下,元空间的大小仅受本地内存限制。

      但是为了整机的性能,尽量还是要对该项进行设置,优化参数配置,以免造成整机的服务停机。

    • 慎重引用第三方包

      对第三方包,一定要慎重选择,不需要的包就去掉。

      这样既有助于提高编译打包的速度,也有助于提高远程部署的速度。

    • 关注动态生成类的框架

      对于使用大量动态生成类的框架,要做好压力测试,验证动态生成的类是否超出内存的需求会抛出异常。

  • 直接内存溢出

    如果直接或间接(很多 java NIO,例如在 netty 的框架中被封装为其他的方法)使用了 ByteBuffer 中的 allocateDirect() 方法,而又不做 clear 的时候,就会抛出 java.lang.OutOfMemoryError: Direct buffer memory 异常。

    如果经常有类似的操作,可以考虑设置 JVM 参数:-XX:MaxDirectMemorySize,并及时 clear 内存。

  • 创建本地线程内存溢出

    除了堆以外的区域,无法为线程分配一块内存区域了(线程基本只占用堆以外的内存区域),要么是内存本身就不够,要么堆的空间设置得太大了,导致了剩余的内存已经不多了,而由于线程本身要占用内存,所以就不够用了。

    优化方案:

    • 首先检查操作系统是否有线程数的限制,如果使用 shell 也无法创建线程,就需要调整系统的最大可支持的文件数。
    • 日常开发中尽量保证线程最大数的可控制的,不要随意使用可以无限制增长的线程池。
  • 数组超限内存溢出

    JVM 在为数组分配内存之前,会执行特定平台的检查:分配的数据结构是否在此平台是可寻址的。

    一般来说 java 对应用程序所能分配数组最大大小是有限制的,只不过不同的平台限制有所不同,但通常在1到21亿个元素之间。当应用程序试图分配大于 Java 虚拟机可以支持的数组时会报 Requested array size exceeds VM limit 错误。

    不过这个错误一般少见的,主要是由于 Java 数组的索引是 int 类型。 Java 中的最大正整数为 2 ^ 31 - 1 = 2,147,483,647。 并且平台特定的限制可以非常接近这个数字,例如:Jdk1.8 可以初始化数组的长度高达 2,147,483,645(Integer.MAX_VALUE-2)。若是在将数组的长度再增加 1 达到 nteger.MAX_VALUE-1 ,就会出现 OutOfMemoryError 了。

    优化方案:数组长度要在平台允许的长度范围之内。

  • 超出交换区内存溢出

    在 Java 应用程序启动过程中,可以通过 -Xmx 和其他类似的启动参数限制指定的所需的内存。而当 JVM 所请求的总内存大于可用物理内存的情况下,操作系统开始将内容从内存转换为硬盘。

    当应用程序向 JVM native heap 请求分配内存失败并且 native heap 也即将耗尽时, JVM 会抛出Out of swap space 错误, 错误消息中包含分配失败的大小(以字节为单位)和请求失败的原因。

    优化方案:

    • 增加系统交换区的大小。

      但如果使用了交换区,性能会大大降低,不建议采用这种方式。

      生产环境尽量避免最大内存超过系统的物理内存。其次,去掉系统交换区,只使用系统的内存,保证应用的性能。

  • 系统杀死进程内存溢出

    操作系统是建立在进程的概念之上,这些进程在内核中作业,其中有一个非常特殊的进程,称为“内存杀手(Out of memory killer)”。当内核检测到系统内存不足时,OOM killer 被激活,检查当前谁占用内存最多然后将该进程杀掉。

    一般 Out of memory:Kill process or sacrifice child 报错会在当可用虚拟内存(包括交换空间)消耗到让整个操作系统面临风险内存不足时,会被触发。在这种情况下,OOM Killer 会选择“流氓进程”并杀死它。

    优化方案:

    • 增加交换空间的方式可以缓解 Java heap space 异常
    • 但还是建议最好的方案就是升级系统内存,让 java 应用有足够的内存可用,就不会出现这种问题。

内存泄漏(memory leak)

简述

  • 也称作“存储渗漏”。

  • 严格来说,只有对象不会再被程序用到了,但是 GC 又不能回收它们的情况,才叫内存泄漏。

    但实际情况很多时候一些不太好的实践(或疏忽)会导致对象的生命周期变得很长甚至导致 OOM,也可以叫做宽泛意义上的“内存泄漏”。

  • 尽管内存泄漏并不会立刻引起程序崩溃,但是一旦发生内存泄漏,程序中的可用内存就会被逐步蚕食,直至耗尽所有内存,最终出现 OutOfMemory 异常,导致程序崩溃。

    注意:这里的可用内存并不是指物理内存,而是指虚拟内存大小,这个虚拟内存大小取决于磁盘交换区设定的大小。

  • Java 使用可达性分析算法,最上面的数据不可达,就是需要被回收的。

    后期有一些对象不用了,按道理应该断开引用,但是存在一些链没有断开,从而导致没有办法被回收


可达性分析算法

可达性分析算法:判断对象是否是不再使用的对象,本质都是判断一个对象是否还被引用。那么对于这种情况下,由于代码的实现不同就会出现很多种内存泄漏问题(让 JVM 误以为此对象还在引用中,无法回收,造成内存泄漏)。

举例说明:

  • 对象 X 引用对象 Y,X 的生命周期比 Y 的生命周期长;
  • 那么当 Y 生命周期结束的时候,X 依然引用着 Y,这时候,垃圾回收期是不会回收对象 Y 的;
  • 如果对象 X 还引用着生命周期比较短的 A、B、C,对象 A 又引用着对象 a、b、c,这样就可能造成大量无用的对象不能被回收,进而占据了内存资源,造成内存泄漏,直到内存溢出。

在这里插入图片描述


Java 中内存泄漏的 8 种情况

  1. 静态集合类,如 HashMap、LinkedList 等等。

    如果这些容器为静态的,那么它们的生命周期与 JVM 程序一致,则容器中的对象在程序结束之前将不能被释放,从而造成内存泄漏。

    简而言之,长生命周期的对象持有短生命周期对象的引用,尽管短生命周期的对象不再使用,但是因为长生命周期对象持有它的引用而导致不能被回收。

  2. 单例模式

    单例模式,和静态集合导致内存泄露的原因类似,因为单例的静态特性,它的生命周期和 JVM 的生命周期一样长,所以如果单例对象如果持有外部对象的引用,那么这个外部对象也不会被回收,那么就会造成内存泄漏。

  3. 内部类持有外部类的引用

    在 Java 中内部类的定义与使用一般为成员内部类与匿名内部类,他们的对象都会隐式持有外部类对象的引用,影响外部类对象的回收。

    可以通过反编译可以来验证这个理论:

    • java 代码

      public class Outer {
          private String name;
          class Inner{
              private String test;
          }
      }
      
    • 反编译后的代码

      class Outer$Inner {
          private String test;
          final Outer this$0;
          Outer$Inner() {
              this.this$0 = Outer.this;
              super();
          }
      }
      

      可以清楚的发现,内部类的属性中有这个外部类,并且在内部类的构造函数中有这个外部类属性的初始化。

    如果一个外部类的实例对象的方法返回了一个内部类的实例对象,而这个内部类对象被长期引用了,那么即使那个外部类实例对象不再被使用,但由于内部类持有外部类的实例对象引用,这个外部类对象将不会被垃圾回收,这也会造成内存泄漏。

  4. 各种连接,如数据库连接、网络连接和 IO 连接等

    在对数据库进行操作的过程中,首先需要建立与数据库的连接,当不再使用时,需要调用 close 方法来释放与数据库的连接。只有连接被关闭后,垃圾回收器才会回收对应的对象。

    否则,如果在访问数据库的过程中,**对 Connection、Statement 或 ResultSet 不显性地关闭,将会造成大量的对象无法被回收,**从而引起内存泄漏。

  5. 变量不合理的作用域

    一般而言,一个变量的定义的作用范围大于其使用范围,很有可能会造成内存泄漏。另一方面,如果没有及时地把对象设置为 null,很有可能导致内存泄漏的发生。

    class Outer$Inner {
        private String test;
        final Outer this$0;
        Outer$Inner() {
            this.this$0 = Outer.this;
            super();
        }
    }
    

    如上面这个伪代码,通过 readFromNet 方法把接受的消息保存在变量 msg 中,然后调用 saveDB 方法把 msg 的内容保存到数据库中,此时 msg 已经就没用了,由于 msg 的生命周期与对象的生命周期相同,此时 msg 还不能回收,因此造成了内存泄漏。

    优化方案:

    • 方案1:这个 msg 变量可以放在方法内部,当方法使用完,那么 msg 的生命周期也就结束,就可以回收了。
    • 方案2:在使用完 msg 后,把 msg 设置为 null,这样垃圾回收器也会回收 msg 的内存空间。
  6. 改变哈希值

    当一个对象被存储进 HashSet 集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了。

    否则,对象修改后的哈希值与最初存储进 HashSet 集合中时的哈希值就不同了,在这种情况下,即使在 contains 方法使用该对象的当前引用作为的参数去 HashSet 集合中检索对象,也将返回找不到对象的结果,这也会导致无法从 HashSet 集合中单独删除当前对象,造成内存泄漏。

    这也是 String 为什么被设置成了不可变类型,可以放心地把 String 存入 HashSet,或者把 String 当做 HashMap 的 key 值;

    当想把自己定义的类保存到散列表的时候,需要保证对象的 hashCode 不可变。

    /**
     * 演示内存泄漏
     */
    public class ChangeHashCode1 {
        public static void main(String[] args) {
            HashSet hs = new HashSet();
            Point cc = new Point();
            cc.setX(10);//hashCode = 41
            hs.add(cc);
            cc.setX(20);//hashCode = 51
            System.out.println("hs.remove = " + hs.remove(cc));//false
            hs.add(cc);
            System.out.println("hs.size = " + hs.size());//size = 2
        }
    }
    
    class Point {
        int x;
    
        public int getX() return x;
        public void setX(int x) this.x = x;
    
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + x;
            return result;
        }
    
        @Override
        public boolean equals(Object obj) {
            if (this == obj) return true;
            if (obj == null) return false;
            if (getClass() != obj.getClass()) return false;
            Point other = (Point) obj;
            if (x != other.x) return false;
            return true;
        }
    }
    
  7. 对象缓存泄漏

    一旦把对象引用放入到缓存中,就很容易遗忘。

    比如:代码中会加载一个表中的数据到缓存(内存)中,测试环境只有几百条数据,但是生产环境则可能会有几百万的数据。

    优化方案:可以使用 WeakHashMap 代表缓存,此种 Map 的特点是,当除了自身有对 key 的引用外,此 key 没有其他引用那么此 map 会自动丢弃此值。

    /**
     * 演示内存泄漏
     */
    public class MapTest {
        static Map wMap = new WeakHashMap();
        static Map map = new HashMap();
    
        public static void main(String[] args) {
            init();
            testWeakHashMap();
            testHashMap();
        }
    
        public static void init() {
            String ref1 = new String("obejct1");
            String ref2 = new String("obejct2");
            String ref3 = new String("obejct3");
            String ref4 = new String("obejct4");
            wMap.put(ref1, "cacheObject1");
            wMap.put(ref2, "cacheObject2");
            map.put(ref3, "cacheObject3");
            map.put(ref4, "cacheObject4");
            System.out.println("String引用ref1,ref2,ref3,ref4 消失");
    
        }
    
        public static void testWeakHashMap() {
    
            System.out.println("WeakHashMap GC之前");
            for (Object o : wMap.entrySet()) {
                System.out.println(o);
            }
            try {
                System.gc();
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("WeakHashMap GC之后");
            for (Object o : wMap.entrySet()) {
                System.out.println(o);
            }
        }
    
        public static void testHashMap() {
            System.out.println("HashMap GC之前");
            for (Object o : map.entrySet()) {
                System.out.println(o);
            }
            try {
                System.gc();
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("HashMap GC之后");
            for (Object o : map.entrySet()) {
                System.out.println(o);
            }
        }
    
    }
    /**
     * 结果
     * String引用ref1,ref2,ref3,ref4 消失
     * WeakHashMap GC之前
     * obejct2=cacheObject2
     * obejct1=cacheObject1
     * WeakHashMap GC之后
     * HashMap GC之前
     * obejct4=cacheObject4
     * obejct3=cacheObject3
     * Disconnected from the target VM, address: '127.0.0.1:51628', transport: 'socket'
     * HashMap GC之后
     * obejct4=cacheObject4
     * obejct3=cacheObject3
     **/
    

    上面代码演示 WeakHashMap 如何自动释放缓存对象:当 init 函数执行完成后,局部变量字符串引用 weakd1,weakd2,d1,d2 都会消失,此时只有静态 map 中保存中对字符串对象的引用,可以看到,调用 gc 之后,HashMap 的没有被回收,而 WeakHashMap 里面的缓存被回收了。

  8. 监听器和回调

    内存泄漏另一个常见来源是监听器和其他回调,如果客户端在实现的 API 中注册回调,却没有显式的取消,那么就会积聚。

    需要确保回调立即被当作垃圾回收的最佳方法是只保存它的弱引用,例如将它们保存成为 WeakHashMap 中的键。

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

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

相关文章

functional interface

更优雅 案例 要在TodoTaskRepository写find方法找到对应task列表,传入自定义的如何find 要传入两个参数,返回一个bool,在文档里找这样的functional interface java8官方文档-Package java.util.function BiPredicate是这样的 接口函数是t…

Numpy基础——人工智能基础

文章目录一、Numpy概述1.优势2.numpy历史3.Numpy的核心:多维数组4.numpy基础4.1 ndarray数组4.2 内存中的ndarray对象一、Numpy概述 1.优势 Numpy(Nummerical Python),补充了Python语言所欠缺的数值计算能力;Numpy是其它数据分析及机器学习库的底层库&…

GitLab CI/CD实现代码推送后自动maven打包发布

1、GitLab CI/CD介绍 CI(Continuous Intergration):即持续集成,将代码的合并、部署、自动化测试都在一起,不断地执行这个过程,并对结果反馈。 CD(Continuous Delivery):即持续交付,持续交付是一种软件工程方…

别具一格的婚礼,VR全景+婚礼的优势展现在哪里?

随着90后、95后逐渐步入结婚的主力军中,如何策划一场别具一格的婚礼是许多年轻人所头疼的,那么今年我们就可以玩点新潮的,VR婚礼或许是个不错的选择。 VR全景婚礼就是通过全景摄像机对婚礼进行记录,不但可以帮助新人捕捉婚礼的精彩…

对S参数的理解II

本篇文章特别感谢粉丝朋友“千年的呢喃”,他给我推荐了一本书,写的非常好 Micro Wave and RF Design,有需要的朋友自行下载。 之前关于S参数也写过几篇文章了,但一直以来都有一个历史遗漏问题没有解决,那就是&#xf…

ElasticSearch-学习笔记05【SpringDataElasticSearch】

Java后端-学习路线-笔记汇总表【黑马程序员】ElasticSearch-学习笔记01【ElasticSearch基本介绍】【day01】ElasticSearch-学习笔记02【ElasticSearch索引库维护】ElasticSearch-学习笔记03【ElasticSearch集群】ElasticSearch-学习笔记04【Java客户端操作索引库】【day02】Ela…

【IVIF的超分重建】

Multimodal super-resolution reconstruction of infrared and visible images via deep learning (基于深度学习的红外和可见光图像多模态超分辨率重建) 提出了一种基于编解码器结构的红外-可见光图像融合方法。图像融合任务被重新表述为保持红外-可见…

2023年3月AMA-CDGA/CDGP数据治理认证考试这些城市可以报名

目前2023年3月5日CDGA&CDGP开放报名的城市有:北京、上海、广州、深圳、杭州、重庆,西安,成都,长沙,济南,更多考场正在增加中… DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业…

Echarts 设置折线图线条样式(虚线+粗细+阴影)

第012个点击查看专栏目录Echarts折线图的lineStyle属性可以设置折线的颜色,粗细,类型,线段末端类型,阴影,透明度,偏移等属性。文章目录示例效果示例源代码(共128行)相关资料参考专栏…

【Java|多线程与高并发】 使用Thread 类创建线程的5种方法如何查看程序中的线程

文章目录前言线程创建1.继承Thread类重写run()方法如何查看程序中的线程?2.实现Runnable接口3.使用匿名内部类,继承Thread4.使用匿名内部类,实现Runnable5.⭐使用Lambda表达式,创建线程(重要)Thread 的常见构造方法总结前言 在这里主要补充说明一些问题,方便更好地理解下面的…

conda安装nodejs版本过低解决方法

conda命令直接安装nodejs时,可能会由于镜像源中nodejs版本过低导致没法安装高本版的nodejs,导致无法jupyterlab使用一些扩展插件。 解决方法如下:(windows环境下直接按提示下载版本安装就行,此处只介绍linux环境的解决…

2023上半年软考中级系统集成项目管理工程师2月25日开班

系统集成项目管理工程师是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目之一,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职…

今天面试招了个28K的人,从腾讯出来的果然都有两把刷子···

公司前段时间缺人,也面了不少测试,前面一开始瞄准的就是中级的水准,也没指望来大牛,提供的薪资在20~30k,面试的人很多,但平均水平很让人失望。看简历很多都是4年工作经验,但面试中,不…

2023年上半年软考高项信息系统项目管理师2月25日开班

信息系统项目管理师是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目之一,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职称资…

每天一道大厂SQL题【Day09】充值日志SQL实战

每天一道大厂SQL题【Day09】充值日志SQL实战 大家好,我是Maynor。相信大家和我一样,都有一个大厂梦,作为一名资深大数据选手,深知SQL重要性,接下来我准备用100天时间,基于大数据岗面试中的经典SQL题&#…

MMDetection(五)

目标检测工具包 MMDetection MMDetection 可以做什么 ➢ MMDetection 提供 400 余个性能优良的预训练模型,开箱即 用,几行 Python API 即可调用强大的检测能力 ➢ MMDetection 涵盖 60 余个目标检测算法,并提供方便易用的 工具,…

【Spring Cloud】如何修改Feign的日志记录级别

本期目录前言1. 介绍2. 方式一:配置文件1)全局生效2)局部生效3. 方式二:Java代码1)全局配置2)局部配置前言 本次示例代码的文件结构如下图所示。 1. 介绍 Feign 允许我们自定义配置,下面是 …

kubernetes集群部署springcloud项目【AL】【未写完】

kubernetes集群部署springcloud项目【AL】 (先手工做,非自动化) #环境: 192.168.73.138 master 192.168.73.139 node1 192.168.73.140 node2 192.168.73.137 harbor、mysqlgit clone https://github.com/lizhenliang/simple-…

leetcode.1234 替换子串得到平衡字符串 - 反向滑动窗口

1234. 替换子串得到平衡字符串 题目: 有一个只含有 Q, W, E, R 四种字符,且长度为 n 的字符串。 假如在该字符串中,这四个字符都恰好出现 n/4 次,那么它就是一个「平衡字符串」。 给你一个这样的字符串 s,请通过「替换…

信息安全管理

信息安全管理信息安全管理信息安全风险管理信息安全管理体系应急响应与灾难恢复应急响应概况信息系统灾难修复灾难恢复相关技术信息安全管理 管理概念:组织、协调、控制的活动,核心过程的管理控制 管理对象和组成:包括人员在内相关资产&…