HotSpot虚拟机OutOfMemoryError异常

news2024/11/26 6:22:03

目录

一、JVM内存区域

二、堆中对象

1. 对象的创建

2. 对象的内存布局

3. 对象的访问定位

三、OOM异常

1. 堆OOM异常测试

2. 栈SOF异常测试

        1):栈容量过小

        2):大量本地变量

3. 常量池OOM异常测试

4. 方法区测试

5. 堆外内存测试

四、参考资料


一、JVM内存区域

        HotSpot虚拟机把内存分为不同的数据区域,有的区域随JVM启动而一直存在(线程共享区域),有的区域随用户线程启动和结束而建立和销毁(线程私有区域),如下图所示。

        下图所示是线程共享的区域,其中堆区由参数-Xms和-Xmx决定堆大小,若是两参数一致,则堆不能动态扩展,否则可动态扩展;JDK7版本方法区内的常量池、静态变量移至堆中;JDK8使用元空间(Metaspace)代替永久代,主要存储类信息

        下图所示是线程私有的区域,其中程序计数器是唯一一个没有OOM异常的区域;虚拟机栈由参数-Xss决定栈容量,不能动态扩展

        下图所示是堆外内存,由参数-XX:MaxDirectMemorySize决定大小,没有配置该参数时,默认大小与-Xmx大小一致。需要注意:直接内存不能主动触发GC回收,只有执行Full GC时,顺带回收堆外内存

二、堆中对象

1. 对象的创建

        开发人员创建对象通常仅仅是个new关键字,而JVM中创建对象的过程如下图所示。

        一般来说,new指令后面若是紧跟着invokespecial指令,则会执行该Class的<init>()方法,这样一个真正可用的对象才完整构造出来。如下图所示是IDEA插件jclasslib查看字节码,new HashSet<>();会同时生成new和invokespecial指令,invokespecial指令会执行HashSet类的<init>()方法完成对象构造

2. 对象的内存布局

        实例数据的存储顺序会受到虚拟机分配策略参数-XX:FieldsAllocationStyle参数和定义顺序的影响,其默认顺序是longs/doubles、ints、shorts/chars、bytes/booleans、oops。分配顺序原则:相同宽度的字段放在一起,父类字段放在子类字段前面

3. 对象的访问定位

        堆中对象是通过虚拟机栈中的reference数据来访问,其访问方式如下图所示。

        两种访问方式:句柄、直接指针,如下图所示。 

三、OOM异常

1. 堆OOM异常测试

        JVM配置:-Xms20M -Xmx20M -XX:+HeapDumpOnOutOfMemoryError,如下代码所示。

package com.cmmon.instance.oom;

import com.google.common.collect.Lists;

import java.util.List;

/**
 * @author tcm
 * @version 1.0.0
 * @description 测试堆OOM
 * @date 2023/5/9 15:48
 **/
public class HeapOom {

    static class OOMObject { }

    /**
     * 堆大小设置,报出:java.lang.OutOfMemoryError
     * -Xms:JVM启动时堆初始化大小,默认是物理内存的1/64
     * -Xmx:堆初最大占用内存大小,默认是物理内存的1/4
     * -XX:+HeapDumpOnOutOfMemoryError:JVM异常退出时,生成Dump堆转储快照,进行分析
     * VM参数:-Xms20M -Xmx20M -XX:+HeapDumpOnOutOfMemoryError
     */
    public static void main(String[] args) {
        List<HeapOom.OOMObject> list = Lists.newArrayList();

        while (true) {
            list.add(new HeapOom.OOMObject());
        }
    }

}

        测试结果如下:

java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid13308.hprof ...
Heap dump file created [30014384 bytes in 0.237 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOf(Arrays.java:3210)
	at java.util.Arrays.copyOf(Arrays.java:3181)
	at java.util.ArrayList.grow(ArrayList.java:265)
	at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:239)
	at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:231)
	at java.util.ArrayList.add(ArrayList.java:462)
	at com.cmmon.instance.oom.HeapOom.main(HeapOom.java:28)

         java_pid13308.hprof堆转储文件分析如下。文件详细参数,参考:https://www.cnblogs.com/duanxz/p/5230856.html

2. 栈SOF异常测试

        HotSpot虚拟机栈,不支持动态扩展,所以导致栈java.lang.StackOverflowError异常,有两种情况:

  • -Xss参数配置栈容量;
  • 方法中定义大量的变量,导致栈帧中本地变量表大。

        1):栈容量过小

        JVM配置:-Xss108k,如下代码所示。

package com.cmmon.instance.oom;

import lombok.Data;

/**
 * @author tcm
 * @version 1.0.0
 * @description 测试栈 - 设置栈容量大小
 * @date 2023/5/9 16:24
 **/
public class JVMStackSOF {

    @Data
    public static class JavaVMStackSOF {
        public int stackLength = 1;

        public void stackLeak() {
            stackLength++;
            // 递归调用
            stackLeak();
        }

    }

    /**
     * 栈容量大小,报出:java.lang.StackOverflowError
     * VM参数:-Xss108k
     * step1:设置-Xss5k,会提示信息"The stack size specified is too small, Specify at least 108k"
     *        说明:当前java的JVM版本与OS,栈容量最低是108k
     * step2:设置-Xss大于等于108k
     */
    public static void main(String[] args) {
        JavaVMStackSOF javaVMStackSOF = new JavaVMStackSOF();

        try {
            javaVMStackSOF.stackLeak();
        } catch (Throwable e) {
            System.out.println("stack length: " + javaVMStackSOF.getStackLength());
            throw e;
        }
    }

}

        测试结果如下:

stack length: 991
Exception in thread "main" java.lang.StackOverflowError
	at com.cmmon.instance.oom.JVMStackSOF$JavaVMStackSOF.stackLeak(JVMStackSOF.java:18)
	at com.cmmon.instance.oom.JVMStackSOF$JavaVMStackSOF.stackLeak(JVMStackSOF.java:20)
	at com.cmmon.instance.oom.JVMStackSOF$JavaVMStackSOF.stackLeak(JVMStackSOF.java:20)
	at com.cmmon.instance.oom.JVMStackSOF$JavaVMStackSOF.stackLeak(JVMStackSOF.java:20)
	at com.cmmon.instance.oom.JVMStackSOF$JavaVMStackSOF.stackLeak(JVMStackSOF.java:20)
	at com.cmmon.instance.oom.JVMStackSOF$JavaVMStackSOF.stackLeak(JVMStackSOF.java:20)
    ......

        2):大量本地变量

        JVM配置:无,如下代码所示。

package com.cmmon.instance.oom;

import lombok.Data;

/**
 * @author tcm
 * @version 1.0.0
 * @description 测试栈 - 大量本地变量
 * @date 2023/5/9 16:48
 **/
public class JVMStackSOF2 {

    @Data
    public static class JavaVMStackSOF2 {
        public int stackLength = 1;

        public void stackLeak() {
            // 定义大量变量
            long useData0, useData1, useData2, useData3, useData4, useData5, useData6, useData7, useData8, useData9,
                    useData10, useData11, useData12, useData13, useData14, useData15, useData16, useData17, useData18, useData19,
                    useData20, useData21, useData22, useData23, useData24, useData25, useData26, useData27, useData28, useData29,
                    useData30, useData31, useData32, useData33, useData34, useData35, useData36, useData37, useData38, useData39,
                    useData40, useData41, useData42, useData43, useData44, useData45, useData46, useData47, useData48, useData49,
                    useData50, useData51, useData52, useData53, useData54, useData55, useData56, useData57, useData58, useData59,
                    useData60, useData61, useData62, useData63, useData64, useData65, useData66, useData67, useData68, useData69,
                    useData70, useData71, useData72, useData73, useData74, useData75, useData76, useData77, useData78, useData79,
                    useData80, useData81, useData82, useData83, useData84, useData85, useData86, useData87, useData88, useData89,
                    useData90, useData91, useData92, useData93, useData94, useData95, useData96, useData97, useData98, useData99;

            stackLength++;
            // 递归调用
            stackLeak();

            useData0 = useData1 = useData2 = useData3 = useData4 = useData5 = useData6 = useData7 = useData8 = useData9
                    = useData10 = useData11 = useData12 = useData13 = useData14 = useData15 = useData16 = useData17 = useData18 = useData19
                    = useData20 = useData21 = useData22 = useData23 = useData24 = useData25 = useData26 = useData27 = useData28 = useData29
                    = useData30 = useData31 = useData32 = useData33 = useData34 = useData35 = useData36 = useData37 = useData38 = useData39
                    = useData40 = useData41 = useData42 = useData43 = useData44 = useData45 = useData46 = useData47 = useData48 = useData49
                    = useData50 = useData51 = useData52 = useData53 = useData54 = useData55 = useData56 = useData57 = useData58 = useData59
                    = useData60 = useData61 = useData62 = useData63 = useData64 = useData65 = useData66 = useData67 = useData68 = useData69
                    = useData70 = useData71 = useData72 = useData73 = useData74 = useData75 = useData76 = useData77 = useData78 = useData79
                    = useData80 = useData81 = useData82 = useData83 = useData84 = useData85 = useData86 = useData87 = useData88 = useData89
                    = useData90 = useData91 = useData92 = useData93 = useData94 = useData95 = useData96 = useData97 = useData98 = useData99 = 0;

        }

    }

    /**
     * 定义大量本地变量,方法栈中本地变量表大增,报出:java.lang.StackOverflowError
     * VM参数:无
     */
    public static void main(String[] args) {
        JVMStackSOF2.JavaVMStackSOF2 javaVMStackSOF2 = new JVMStackSOF2.JavaVMStackSOF2();

        try {
            javaVMStackSOF2.stackLeak();
        } catch (Throwable e) {
            System.out.println("stack length: " + javaVMStackSOF2.getStackLength());
            throw e;
        }
    }

}

        测试结果如下:

stack length: 596
Exception in thread "main" java.lang.StackOverflowError
	at com.cmmon.instance.oom.JVMStackSOF2$JavaVMStackSOF2.stackLeak(JVMStackSOF2.java:30)
	at com.cmmon.instance.oom.JVMStackSOF2$JavaVMStackSOF2.stackLeak(JVMStackSOF2.java:32)
	at com.cmmon.instance.oom.JVMStackSOF2$JavaVMStackSOF2.stackLeak(JVMStackSOF2.java:32)
	at com.cmmon.instance.oom.JVMStackSOF2$JavaVMStackSOF2.stackLeak(JVMStackSOF2.java:32)
	at com.cmmon.instance.oom.JVMStackSOF2$JavaVMStackSOF2.stackLeak(JVMStackSOF2.java:32)
    ......

3. 常量池OOM异常测试

        JVM:-Xmx6M,如下代码所示。需要注意:JDK8版本中,已经移除-XX:PermSize=6M和-XX:MaxPermSize=6M这两个参数,JDK6的常量池是放在方法区中,属永久代;而JDK8放在堆中,就一直运行下去

package com.cmmon.instance.oom;

import java.util.HashSet;
import java.util.Set;

/**
 * @author tcm
 * @version 1.0.0
 * @description 测试常量池OOM
 * @date 2023/5/9 16:54
 **/
public class ConstantPoolOOM {

    /**
     * 常量池容量限制,报出:java.lang.OutOfMemoryError
     * VM参数:-XX:PermSize=6M -XX:MaxPermSize=6M
     * Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=6M; support was removed in 8.0
     * Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=6M; support was removed in 8.0
     * 上述说明:JDK8版本中,已经移除这两个参数,JDK6的常量池是放在方法区中,属永久代;而JDK8放在堆中,就一直运行下去。
     *
     * VM参数:-Xmx6M
     * Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
     */
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();

        int i = 0;
        while (true) {
            set.add(String.valueOf(i++).intern());
        }
    }

}

        测试结果如下:

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
	at java.util.HashMap.newNode(HashMap.java:1747)
	at java.util.HashMap.putVal(HashMap.java:631)
	at java.util.HashMap.put(HashMap.java:612)
	at java.util.HashSet.add(HashSet.java:220)
	at com.cmmon.instance.oom.ConstantPoolOOM.main(ConstantPoolOOM.java:29)

        测试JDK8版本常量池在堆中,测试代码如下。

/**
 * JDK8版本测试:常量池在堆中
 * String::intern
 * 字符串常量池已有该字符串:返回该字符串的引用
 * 字符串常量池没有该字符串:该字符串添加到常量池中,并返回该字符串的引用
 */
public void constantPoolOOM2() {
    String s1 = new StringBuilder("计算机").append("软件").toString();
    System.out.println(s1.intern());        // 计算机软件,属于第一次出现
    System.out.println(s1.intern() == s1);  // true

    // sun.misc.Version该类加载时,已经出现该“java”字符串
    String s2 = new StringBuilder("ja").append("va").toString();
    System.out.println(s2.intern());        // java,属于第二次出现
    System.out.println(s2.intern() == s2);  // false
}

4. 方法区测试

        JVM:-XX:MetaspaceSize=64M -XX:MaxMetaspaceSize=128M,如下代码所示。注意:JDK8版本方法区改为元空间,存储类信息;而常量、静态变量放入堆中

package com.cmmon.instance.oom;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @author tcm
 * @version 1.0.0
 * @description 测试方法区(元空间)
 * @date 2023/5/9 17:01
 **/
public class MethodAreaOOM {

    static class MethodAreaObject { }

    /**
     * 方法区内存溢出,报出:java.lang.OutOfMemoryError
     * -XX:MetaspaceSize设置元空间初始化大小,到达该值触发GC类型卸载,同时会对该值进行调整
     * -XX:MaxMetaspaceSize设置元空间最大值,默认-1,整个内存空间
     * -XX:MaxMetaspaceFreeRatio设置GC回收后控制元空间剩余容量最大百分比
     * -XX:MinMetaspaceFreeRatio设置GC回收后控制元空间剩余容量最小百分比
     *
     * VM参数:-XX:MetaspaceSize=64M -XX:MaxMetaspaceSize=128M
     * Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "main"
     */
    public static void main(String[] args) {
        while (true) {
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(MethodAreaOOM.MethodAreaObject.class);
            enhancer.setUseCache(false);
            enhancer.setCallback(new MethodInterceptor() {
                @Override
                public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                    return methodProxy.invoke(o, new String[]{});
                }
            });
            enhancer.create();
        }
    }

}

        测试结果如下:

Exception in thread "main" org.springframework.cglib.core.CodeGenerationException: java.lang.OutOfMemoryError-->Metaspace
	at org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:538)
	at org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:363)
	at org.springframework.cglib.proxy.Enhancer.generate(Enhancer.java:585)
	at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:131)
	at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:319)
	at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:572)
	at org.springframework.cglib.proxy.Enhancer.create(Enhancer.java:387)
	at com.cmmon.instance.oom.MethodAreaOOM.main(MethodAreaOOM.java:40)
Caused by: java.lang.OutOfMemoryError: Metaspace
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
	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 org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:535)
	... 7 more

5. 堆外内存测试

        JVM:-Xmx20M -XX:MaxDirectMemorySize=10M,如下代码所示。

package com.cmmon.instance.oom;

import sun.misc.Unsafe;

import java.lang.reflect.Field;

/**
 * @author tcm
 * @version 1.0.0
 * @description 测试直接内存(堆外内存)OOM
 * @date 2023/5/9 17:09
 **/
public class DirectMemoryOOM {

    /**
     * 直接内存溢出,报出:java.lang.OutOfMemoryError
     * -XX:MaxDirectMemorySize设置堆外内存最大值,若没有指定大小则与-Xmx大小一致
     *
     * VM参数:-Xmx20M -XX:MaxDirectMemorySize=10M
     */
    public static void main(String[] args) throws IllegalAccessException {
        int _1MB = 1024 * 1024;

        Field unsafeField = Unsafe.class.getDeclaredFields()[0];
        unsafeField.setAccessible(true);

        Unsafe unsafe = (Unsafe) unsafeField.get(null);

        while (true) {
            unsafe.allocateMemory(_1MB);
        }
    }

}

        测试结果如下:

Exception in thread "main" java.lang.OutOfMemoryError
	at sun.misc.Unsafe.allocateMemory(Native Method)
	at com.cmmon.instance.oom.DirectMemoryOOM.main(DirectMemoryOOM.java:30)

四、参考资料

JVM内存模型_小搬砖仔的博客-CSDN博客

https://www.cnblogs.com/duanxz/p/5230856.html

https://www.cnblogs.com/duanxz/p/8510623.html

为对象分配内存——TLAB_usetlab_chengqiuming的博客-CSDN博客

JVM调优常用参数_-xx:+printreferencegc_point-break的博客-CSDN博客

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

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

相关文章

详解FreeRTOS:嵌入式多任务系统的任务互斥和优先级反转(理论篇—9)

在嵌入式多任务系统中,有些资源必须是独占使用的,多个任务对这样的资源的并发访问将导致错误的发生。一般来说,对需要独占使用的资源必须使用互斥方法将对其的并发访问串行化。 在优先级多任务系统中引入互斥方案,会导致任务优先级反转的问题:假如某时低优先级的任务占有…

Zabbix之2023 Zabbix6.4最新高级特性、优缺点及其实现原理总结

目录 Zabbix高级特性1. 自动发现 Zabbix高级特性2. 分布式监控 Zabbix高级特性3. 高级报警 Zabbix高级特性4. 可视化 Zabbix高级特性5. API Zabbix高级特性6. 高可用性 Zabbix高级特性7. 安全性 Zabbix高级特性8. 无代理监控 SNMP IPMI JMX Zabbix高级特性9. Agent…

【Windows】局域网内远程桌面控制

【Windows】局域网内远程桌面控制 1、背景2、设置登录密码3、启用远程桌面4、远程示例 1、背景 工作中的很多场景需要远程操作&#xff0c;这时候可以借助远程桌面应用程序实现&#xff0c; 比如AnyDesk、向日葵、TeamViewer等。 windows10系统&#xff0c;其操作系统自带了远…

python基础知识(三):比较运算符、布尔运算符和位运算

目录 1. 比较运算符2. 布尔运算符3. 位运算 1. 比较运算符 比较运算符通常为以下6种&#xff1a; (1) 大于">“&#xff0c;比较两个数a、b的大小&#xff0c;比较的结果如果a大于b则为True&#xff0c;否则为False&#xff1b; (2) 大于等于”>“&#xff0c;比较…

【论文阅读笔记】Contrast image correction method

论文小结&#xff1a; 本文是2010年发表出来的一篇文章&#xff0c;提出的方法是一种增强对比度的方法&#xff0c;其基本原理是自适应参数的 ganma 校正。ganma 校正的目标在于同时校正曝光过度和曝光不足区域的图像。   同时&#xff0c;为了防止光晕伪影&#xff0c;使用双…

vue 【git】

文章目录 前言一、git 工作流程二、常用的git命令1.git 初始化2.修改的内容提交到暂存区3.暂存区的内容提交到本地仓库4.创建分支5.切换分支6.展示分支7.删除分支8.合并指定分支到当前分支9.本地仓库的内容提交到远程仓库10.合并分支11.上传本地仓库分支到远程仓库分支 前言 什…

路径规划算法:基于闪电搜索优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于闪电搜索优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于闪电搜索优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

第12届蓝桥杯Scratch国赛真题集锦

程题 第 1 题 问答题 博土江出题 题目说明 编程实现:博土汪出了5道加法选择题&#xff0c;请同学们给出正确选项 具体要求 1).博士汪问:“n m ?”&#xff0c;n (0-9随机数)&#xff0c;m (0-9随机数) 2).下方A、B、C、D四个选项&#xff0c;随机一个选项为正确答案&#xff…

通过Python的PyPDF2库合并多个pdf文件

文章目录 前言一、PyPDF2库是什么&#xff1f;二、安装PyPDF2库三、查看PyPDF2库版本四、合并多个pdf文件1.引入库2.定义pdf路径3.获取所有要合并的PDF文件名4.创建一个新的PDF文件5.遍历所有PDF文件名6.打开PDF文件7.创建PDF阅读器对象8.遍历PDF中的每一页&#xff0c;并将它们…

嵌入式c语言-进制转换

10进制转2进制 以10进制的16,18为例子 利用短除法 每次除以2并且记录余数 直到商为1 然后从下往上写出 商余数 10进制转16进制 以55 180 500举例 利用短除法 每次除以16并且记录余数 直到商为1 然后从下往上写出 商余数 商和余数要写成16进制的形式 10进制转8进制 以15为…

(浙大陈越版)数据结构 第三章 树(上) 3.3 二叉树的遍历

目录 3.3.1 遍历&#xff08;先中后&#xff09; 二叉树的遍历 先序遍历&#xff1a; 中序遍历 后序遍历 tips: 3.3.2 中序非递归遍历 非递归算法实现的基本思路&#xff1a;使用堆栈 中序遍历的非递归算法具体实现方法为&#xff1a; 3.3.3 层序遍历 难点 解决方法…

经典神经网络(5)GoogLeNet及其在Fashion-MNIST数据集上的应用

经典神经网络(5)GoogLeNet及其在Fashion-MNIST数据集上的应用 1 Inception V1 的简述 Inception 网络是卷积神经网络的一个重要里程碑。在Inception 之前&#xff0c;大部分流行的卷积神经网络仅仅是把卷积层堆叠得越来越多&#xff0c;使得网络越来越深。这使得网络越来越复杂…

计算机组成原理-中央处理器-控制器功能和原理

目录 一、硬布线控制器 二、硬布线控制器的设计(硬件) 2.1分析每个阶段的微操作序列(取址、间址、执行、中断) 2.2选择cpu的控制方式 2.3 安排微操作时序 2.4电路设计 2.4.1列出操作时间表 2.4.2 写出微操作命令的最简表达式 2.4.3画出电路图 *三、微程序控制器基本原理 四…

剪映 自动打关键帧 AutoHotkey

牙叔教程 简单易懂 明确目的 做小说推文的话&#xff0c; 前面几分钟肯定要自己打关键帧&#xff0c; 所以这里的自动打关键帧指的是后面几分钟的图片&#xff0c; 对关键帧要求比较高的同学可以划走了, 因为这里介绍的是简单的 上上下下缩放的关键帧 要求 用剪映提取字幕…

【Python Twisted】零基础也能轻松掌握的学习路线与参考资料

Python Twisted是一个用于网络编程的事件驱动的框架&#xff0c;该框架使用异步I/O模型和回调函数。它支持多种协议&#xff0c;包括TCP、UDP、SSL/TLS、XMPP等&#xff0c;可以用来编写Web服务器、聊天应用、邮件服务器等。Twisted是一个成熟的框架&#xff0c;拥有强大的社区…

【JavaEE】文件操作和IO

目录 1、认识文件 1.1、路径 1.1.1 、绝对路径 1.1.2、相对路径 1.2、文本文件 vs 二进制文件 2、文件系统操作 3、文件内容操作 3.1、字节流用来输入的抽象类InputStream的方法使用 3.1.1、FileInputStream类的构造方法 3.1.2、字节流读操作 3.1.3、字节流写操作 3.…

Presto从入门到精通以及案例实操系列

1、简介 1.1、Presto的由来 Presto最初由Facebook公司开发&#xff0c;旨在解决Facebook内部大规模数据处理和数据分析的问题。在传统的Hadoop生态圈中&#xff0c;MapReduce作为数据处理框架&#xff0c;虽然能够处理海量数据&#xff0c;但是其查询性能却比较低下&#xff…

《面试1v1》CountDownLatch和CyclicBarrier

我是 javapub&#xff0c;一名 Markdown 程序员从&#x1f468;‍&#x1f4bb;&#xff0c;八股文种子选手。 面试官&#xff1a; 你用过 CountDownLatch 和 CyclicBarrier 吗&#xff1f; 候选人&#xff1a; 当然可以。CountDownLatch 和 CyclicBarrier 都是 Java 中用于多…

通过 docker-compose 快速部署 MySQL保姆级教程

文章目录 一、概述二、前期准备1&#xff09;部署 docker2&#xff09;部署 docker-compose 三、创建网络四、MySQL 编排部署1&#xff09;构建镜像 Dockerfile2&#xff09;配置文件2&#xff09;编排 docker-compose.yaml3&#xff09;开始部署 五、简单测试验证六、常用的 M…

在线排查内存泄漏的步骤

一、在线排查内存泄漏的步骤 想到内存泄漏问题的排查&#xff0c;很多开发会想到使用 Valgrind。使用 Valgrind 有几个局限&#xff1a; 需要安装 Valgrind 需要启停服务进程 影响服务进程性能 依赖于测试用例覆盖到 BUG 分支 由于这些原因&#xff0c;线上内存泄露问题并…