爱站网综合查询wordpress wp_redirect

张小明 2026/1/10 12:25:14
爱站网综合查询,wordpress wp_redirect,wordpress文章中加入搜索框,东莞市网站开发文章目录目录前言一、JVM 核心模块全局总览二、JVM 类加载机制深度解析1. 类加载生命周期#xff08;7个阶段#xff09;2. 类加载器与双亲委派模型2.1 类加载器层次结构对比表2.2 双亲委派模型核心解析#xff08;1#xff09;核心原理#xff08;2#xff09;核心优势7个阶段2. 类加载器与双亲委派模型2.1 类加载器层次结构对比表2.2 双亲委派模型核心解析1核心原理2核心优势3破坏场景2.3 自定义类加载器代码示例三、JVM 运行数据区内存模型1. 运行数据区核心分类对比表2. 核心内存区域详细解析2.1 堆Heap对象实例的核心存储区域2.2 虚拟机栈方法调用的栈帧容器2.3 方法区元空间类元数据的存储区域四、JVM 垃圾回收GC核心机制1. 核心前提判断对象是否可回收1GC Roots 核心组成2Java 引用类型影响对象可回收性2. 垃圾回收算法3. 垃圾回收器4. GC 触发条件5. 内存溢出OOM实战示例1堆内存溢出最常见2虚拟机栈溢出栈深度超限五、总结与生产实践建议目录前言若对您有帮助的话请点赞收藏加关注哦您的关注是我持续创作的动力有问题请私信或联系邮箱funian.gmgmail.comJava 程序的跨平台运行依赖于 Java 虚拟机JVM的支撑而类加载机制、运行数据区内存模型、垃圾回收GC是 JVM 的三大核心基础模块。类加载负责将字节码文件加载到 JVM 并转化为可执行结构运行数据区是程序运行时的内存载体垃圾回收则自动释放无用内存、避免内存泄漏。这三大模块共同决定了 Java 程序的运行效率、稳定性以及内存使用效率也是排查内存溢出OOM、内存泄漏等问题的关键。一、JVM 核心模块全局总览先通过汇总表格建立三大模块的整体认知明确其定位与关联核心模块核心作用核心组件/流程关联关系核心问题类加载机制将.class字节码文件加载到 JVM转化为 Class 对象并初始化1. 类加载生命周期7步2. 类加载器层次4层3. 双亲委派模型类加载的结果Class 对象存储在运行数据区的方法区类的实例对象存储在堆中类加载失败、类重复加载、双亲委派破坏运行数据区程序运行时的内存分配与存储载体1. 线程私有区域程序计数器、虚拟机栈、本地方法栈2. 线程共享区域堆、方法区/元空间垃圾回收主要针对线程共享区域堆元空间进行内存释放内存溢出OOM、内存泄漏、栈溢出StackOverflowError垃圾回收GC自动识别并释放无用内存避免内存泄漏1. 可回收对象判断算法2. 垃圾回收算法3. 垃圾回收器4. GC 触发条件依赖运行数据区的内存布局针对堆的分代结构采用不同回收策略垃圾回收频繁性能损耗、内存溢出回收不及时、GC 停顿时间过长二、JVM 类加载机制深度解析类加载机制是 JVM 将外部.class字节码文件二进制文件加载到内存中经过验证、准备、解析、初始化等步骤最终转化为可使用的 Class 对象的过程具有动态加载特性并非程序启动时一次性加载所有类而是按需加载。1. 类加载生命周期7个阶段类的生命周期分为 7 个阶段其中加载、验证、准备、解析、初始化为类加载的核心流程使用和卸载为后续生命周期具体如下表生命周期阶段核心作用关键细节是否必须执行异常可能性加载Loading1. 根据类的全限定名如java.lang.String查找.class字节码文件2. 将字节码文件读取到内存3. 在方法区中生成对应的 Class 对象作为访问该类的入口1. 类加载器负责查找字节码本地文件、网络、动态生成等2. Class 对象存储在方法区实例对象存储在堆中是是类未找到、字节码损坏等抛出ClassNotFoundException验证Verification校验字节码文件的合法性确保其符合 JVM 规范不危害 JVM 安全1. 格式验证是否符合.class文件格式2. 语义验证类结构是否合法如是否有父类3. 字节码验证指令是否合法避免非法操作4. 符号引用验证符号引用是否能解析为直接引用是是校验失败抛出VerifyError准备Preparation为类的静态变量分配内存并设置默认初始值零值1. 仅处理静态变量实例变量在对象实例化时分配堆中2. 默认初始值int→0、String→null、boolean→false3. 若静态变量被final修饰常量直接赋值为显式值如public final static int a10准备阶段赋值为10非0是否解析Resolution将类中的符号引用如类名、方法名的字符串形式转化为直接引用如内存地址、指针的具体地址1. 符号引用编译期生成无实际内存地址2. 直接引用运行期生成指向实际内存地址3. 解析时机默认在准备阶段后、初始化前可延迟到初始化后动态绑定场景是是解析失败抛出NoClassDefFoundError、NoSuchMethodError等初始化Initialization执行类的静态代码块static{}和静态变量的显式赋值非默认值1. 初始化触发条件主动使用被动使用不触发- 创建类的实例new User()- 调用类的静态方法User.staticMethod()- 访问类的静态变量User.staticVarfinal常量除外- 反射调用Class.forName(com.test.User)- 初始化子类时父类会先初始化- 启动类包含main()方法的类2. 静态代码块按编写顺序执行且仅执行一次是是静态代码块/静态变量赋值异常抛出ExceptionInInitializerError使用Using程序通过 Class 对象创建实例、调用方法/变量使用类的功能1. 实例对象存储在堆中栈帧中的引用指向堆对象2. 多次创建实例仅对应一个 Class 对象方法区中否是运行时异常如NullPointerException卸载Unloading当类不再被使用时释放 Class 对象占用的方法区内存完成类的生命周期结束类卸载的3个条件缺一不可1. 该类的所有实例对象已被回收堆中无该类对象2. 加载该类的类加载器已被回收3. 该类的 Class 对象无任何引用如反射引用已释放否否2. 类加载器与双亲委派模型2.1 类加载器层次结构对比表JVM 提供了 3 种内置类加载器同时支持自定义类加载器按层次结构从上到下如下类加载器类型父类加载器核心职责加载资源来源是否为Java实现权限范围启动类加载器Bootstrap ClassLoader无C实现不属于Java类体系加载 JVM 核心类库Java 基础类JAVA_HOME/jre/lib目录如rt.jar、core.jar否C实现最高仅能加载指定目录下的核心类库扩展类加载器Extension ClassLoader启动类加载器加载 Java 扩展类库JAVA_HOME/jre/lib/ext目录或java.ext.dirs系统属性指定目录是Java实现中等加载扩展类库应用程序类加载器Application ClassLoader扩展类加载器加载应用程序的业务代码项目 ClassPath 下的类项目src/main/resources、lib依赖包、ClassPath 目录是Java实现普通加载应用业务类默认类加载器自定义类加载器Custom ClassLoader应用程序类加载器加载自定义来源的类如加密字节码、网络字节码、本地非ClassPath目录类网络、本地磁盘非默认目录、动态生成的字节码等是继承ClassLoader实现自定义可按需控制类的加载逻辑如加密解密2.2 双亲委派模型核心解析1核心原理双亲委派模型是 JVM 类加载的核心机制其核心思想是当一个类加载器收到类加载请求时首先将请求委托给父类加载器加载只有当父类加载器无法加载该类时子类加载器才会尝试自己加载。具体执行流程应用程序类加载器收到类加载请求先委托给扩展类加载器扩展类加载器收到请求再委托给启动类加载器启动类加载器检查是否能加载该类是否在核心类库目录下若能则加载否则返回给扩展类加载器扩展类加载器检查自身目录若能加载则加载否则返回给应用程序类加载器应用程序类加载器检查项目 ClassPath若能加载则加载否则抛出ClassNotFoundException。2核心优势优势名称具体说明沙箱安全防止核心类库被恶意篡改如自定义java.lang.String类由于双亲委派会优先由启动类加载器加载核心String类避免恶意类替换类的唯一性确保全限定名相同的类仅被一个类加载器加载避免类重复加载如User类仅在方法区生成一个 Class 对象3破坏场景双亲委派模型并非绝对不可破坏常见破坏场景有自定义类加载器重写loadClass()方法默认loadClass()实现双亲委派重写后可跳过委托逻辑SPI 机制如 JDBCDriverManager需加载第三方驱动类通过线程上下文类加载器打破双亲委派热部署如 Tomcat不同 Web 应用需加载各自的类通过自定义类加载器隔离打破双亲委派。2.3 自定义类加载器代码示例importjava.io.ByteArrayOutputStream;importjava.io.FileInputStream;importjava.io.InputStream;// 自定义类加载器加载本地非ClassPath目录下的.class文件publicclassCustomClassLoaderextendsClassLoader{// 自定义类加载的根目录privateStringrootDir;publicCustomClassLoader(StringrootDir){// 父类加载器默认是应用程序类加载器super();this.rootDirrootDir;}// 核心方法重写findClass不破坏双亲委派推荐方式OverrideprotectedClass?findClass(Stringname)throwsClassNotFoundException{try{// 1. 将类的全限定名转为文件路径如 com.test.User → com/test/User.classStringclassNamename.replace(.,/).class;StringfilePathrootDir/className;// 2. 读取.class文件字节数组InputStreaminnewFileInputStream(filePath);ByteArrayOutputStreamoutnewByteArrayOutputStream();byte[]buffernewbyte[1024];intlen;while((lenin.read(buffer))!-1){out.write(buffer,0,len);}byte[]classBytesout.toByteArray();in.close();out.close();// 3. 定义类将字节数组转为Class对象returndefineClass(name,classBytes,0,classBytes.length);}catch(Exceptione){thrownewClassNotFoundException(类加载失败name,e);}}publicstaticvoidmain(String[]args)throwsException{// 自定义类加载器加载 D:/custom_class 目录下的类CustomClassLoaderclassLoadernewCustomClassLoader(D:/custom_class);// 加载 com.test.User 类Class?userClassclassLoader.loadClass(com.test.User);// 输出类加载器信息System.out.println(类加载器userClass.getClassLoader().getClass().getName());// 创建实例ObjectuseruserClass.newInstance();System.out.println(实例对象user.getClass().getName());}}三、JVM 运行数据区内存模型JVM 运行数据区是程序运行时内存分配的区域根据「线程私有/线程共享」分为两大类别其中 JDK 8 与 JDK 7 最大的区别是移除永久代PermGen引入元空间Metaspace元空间存储在本地内存Native Memory而非 JVM 堆内存有效解决永久代内存溢出问题。1. 运行数据区核心分类对比表内存区域类型具体区域名称线程归属核心作用存储内容生命周期常见异常JDK 8 变化说明线程私有区域程序计数器Program Counter Register私有1. 记录当前线程执行的字节码指令地址行号2. 线程切换后能恢复到正确的执行位置3. 支持 Native 方法执行 Native 方法时计数器值为undefined字节码指令地址、行号偏移量与线程一致无唯一不会抛出 OOM 的内存区域无变化虚拟机栈VM Stack私有存储当前线程的方法调用栈帧每个方法执行时创建一个栈帧方法执行完毕栈帧出栈栈帧包含局部变量表、操作数栈、动态链接、方法返回地址等与线程一致1.StackOverflowError栈深度超过虚拟机栈最大容量如无限递归2.OutOfMemoryError虚拟机栈可动态扩展扩展时内存不足无变化本地方法栈Native Method Stack私有与虚拟机栈功能一致专门用于支撑 Native 方法非Java实现的方法如Object.hashCode()的执行Native 方法的栈帧与线程一致同虚拟机栈StackOverflowError、OutOfMemoryError无变化线程共享区域堆Heap共享JVM 中最大的内存区域用于存储对象实例和数组几乎所有对象实例都在此分配1. 对象实例如new User()2. 数组如new int[10]3. 字符串常量池JDK 7 及以后移至此与 JVM 一致OutOfMemoryError堆内存不足无法分配新对象无变化仍分新生代和老年代方法区Method Area共享存储类的元数据、静态变量、常量、即时编译器编译后的代码等1. 类的元数据Class 对象、类结构信息2. 静态变量static修饰的变量3. 常量final修饰的变量如字符串常量池早期版本4. 即时编译JIT后的机器码与 JVM 一致OutOfMemoryError方法区内存不足JDK 8 中方法区的实现由「永久代PermGen」改为「元空间Metaspace」元空间存储在本地内存默认无最大内存限制可通过参数配置2. 核心内存区域详细解析2.1 堆Heap对象实例的核心存储区域堆是 JVM 中最大的内存区域也是垃圾回收的主要目标GC 主要回收堆内存其内部采用「分代存储」模型分为新生代和老年代具体如下堆分代细分区域占堆内存比例核心作用垃圾回收策略回收特点新生代Young GenerationEden 区80%新生代占比存储新创建的对象实例绝大多数对象在此创建标记-复制算法回收频率高、回收速度快、回收效率高Minor GC 主要发生在此Survivor 0S0/From10%新生代占比存储 Eden 区回收后存活的对象标记-复制算法与 S1 区互为“From”和“To”每次 GC 后互换角色Survivor 1S1/To10%新生代占比存储 S0 区回收后存活的对象或反之标记-复制算法始终有一个 Survivor 区为空用于对象复制老年代Old Generation无细分可按区域划分20%~50%堆总内存占比可配置存储新生代中多次回收后仍存活的对象老年对象标记-整理算法回收频率低、回收速度慢、回收开销大Major GC/Full GC 主要发生在此核心规则对象优先在 Eden 区分配当 Eden 区内存不足时触发 Minor GC新生代 GC回收 Eden 区和 S0 区的无用对象存活对象复制到 S1 区之后 S0 和 S1 互换角色当对象在 Survivor 区存活次数达到阈值默认 15可通过-XX:MaxTenuringThreshold配置将晋升到老年代大对象如大数组可直接在老年代分配避免新生代频繁 GC可通过-XX:PretenureSizeThreshold配置大对象阈值。2.2 虚拟机栈方法调用的栈帧容器虚拟机栈的核心组成是「栈帧」每个方法执行对应一个栈帧入栈方法执行完毕对应栈帧出栈栈帧内部结构如下栈帧组成部分核心作用关键细节局部变量表存储方法的局部变量包括参数、局部变量1. 容量以「变量槽Slot」为单位每个 Slot 可存储基本数据类型、引用类型2. 局部变量表在编译期确定容量运行期不可改变3. 方法参数按顺序存储在局部变量表中操作数栈作为方法执行的临时数据存储和运算场地1. 采用栈结构先进后出用于存放运算操作数和运算结果2. 执行字节码指令时从局部变量表加载数据到操作数栈运算后将结果存回局部变量表动态链接将栈帧中的符号引用转化为直接引用1. 指向方法区中的 Class 元数据用于调用类的方法/访问变量2. 支持动态绑定运行时确定调用的方法如多态方法返回地址记录方法执行完毕后需要返回的指令地址1. 方法正常执行完毕返回调用方的下一条指令地址2. 方法异常执行完毕通过异常表找到返回地址无需存储在栈帧中2.3 方法区元空间类元数据的存储区域JDK 8 中元空间Metaspace替代永久代PermGen作为方法区的实现核心区别如下特性永久代PermGenJDK 7及以前元空间MetaspaceJDK 8及以后内存来源JVM 堆内存本地内存Native Memory最大内存限制默认有上限可通过-XX:MaxPermSize配置默认无上限受物理内存限制可通过-XX:MaxMetaspaceSize配置内存溢出风险较高容易因类过多、静态变量过多导致 OOM较低内存空间充足可通过参数控制垃圾回收仅回收无用的类元数据回收效率低回收无用类元数据效率更高与堆 GC 协同执行四、JVM 垃圾回收GC核心机制垃圾回收Garbage CollectionGC是 JVM 的自动内存管理机制核心目标是自动识别并释放无用对象占用的内存避免内存泄漏和内存溢出。GC 的核心流程包括判断对象是否可回收、选择垃圾回收算法、使用垃圾回收器执行回收。1. 核心前提判断对象是否可回收在执行垃圾回收前JVM 首先需要判断哪些对象是“无用对象”可回收对象主流判断算法有两种判断算法核心原理优点缺点是否为JVM默认算法引用计数法为每个对象分配一个引用计数器当对象被引用时计数器1引用失效时计数器-1当计数器值为0时判定为可回收对象实现简单、判断效率高、无停顿无法解决循环引用问题如 A 引用 BB 引用 A两者计数器均不为0无法被回收否可达性分析算法以「GC Roots」为根节点构建对象引用链若某个对象无法通过任何 GC Roots 到达引用链断裂则判定为可回收对象能解决循环引用问题判断准确实现复杂、需要暂停所有用户线程Stop The WorldSTW是JVM 默认算法1GC Roots 核心组成GC Roots 是可达性分析的根节点必须是“存活对象”核心组成如下虚拟机栈中栈帧的局部变量表引用的对象如方法中的局部变量本地方法栈中 Native 方法引用的对象方法区中类的静态变量引用的对象如static User user new User()方法区中常量引用的对象如final User user new User()JVM 内部的核心对象如类加载器、线程对象等。2Java 引用类型影响对象可回收性Java 中的引用分为 4 种类型不同引用类型对应对象的可回收优先级不同具体如下表引用类型核心特性回收时机适用场景示例强引用Strong Reference最普通的引用类型默认所有引用都是强引用只有当强引用失效如引用赋值为 null时对象才可能被回收绝大多数业务场景存储核心业务对象User user new User();user 为强引用软引用Soft Reference强度弱于强引用用于存储非核心对象当 JVM 堆内存不足时会回收软引用关联的对象在 OOM 之前缓存场景如图片缓存、数据缓存SoftReferenceUser softRef new SoftReference(new User());弱引用Weak Reference强度弱于软引用用于存储临时对象只要发生 GC无论堆内存是否充足都会回收弱引用关联的对象临时缓存、ThreadLocal 中的键值对、WeakHashMap 等WeakReferenceUser weakRef new WeakReference(new User());虚引用Phantom Reference强度最弱仅用于感知对象的回收事件无法通过虚引用获取对象实例对象回收时会触发虚引用的通知跟踪对象回收、管理直接内存如 NIO 堆外内存PhantomReferenceUser phantomRef new PhantomReference(new User(), referenceQueue);2. 垃圾回收算法JVM 提供了 4 种核心垃圾回收算法其中分代收集算法是基于前 3 种基础算法的组合适配堆的分代结构具体如下表垃圾回收算法核心原理优点缺点适用区域标记-清除算法Mark-Sweep1. 标记通过可达性分析标记所有可回收对象2. 清除释放标记为可回收的对象占用的内存实现简单、无需移动对象1. 内存碎片严重大量不连续内存块无法分配大对象2. 标记和清除效率低老年代早期版本标记-复制算法Mark-Copy1. 将内存划分为大小相等的两个区域From 区和 To 区2. 标记标记可回收对象3. 复制将存活对象复制到 To 区4. 清除清空 From 区之后 From 区和 To 区互换角色1. 无内存碎片2. 回收效率高复制存活对象数量少1. 内存利用率低仅使用 50% 内存2. 若存活对象多复制开销大新生代Eden 区Survivor 区标记-整理算法Mark-Compact1. 标记通过可达性分析标记所有可回收对象2. 整理将存活对象移动到内存一端按顺序排列3. 清除释放存活对象右侧的所有内存1. 无内存碎片2. 内存利用率高100% 利用整理阶段需要移动对象开销大、效率低老年代分代收集算法Generational Collection基于堆的分代结构结合标记-复制算法新生代和标记-整理算法老年代针对不同分代采用不同回收策略1. 兼顾回收效率和内存利用率2. 适配对象的生命周期特性新生代对象存活时间短老年代对象存活时间长实现复杂需要区分对象分代整个堆JVM 默认算法3. 垃圾回收器垃圾回收器是垃圾回收算法的具体实现JVM 提供了多种垃圾回收器不同回收器适用于不同场景核心回收器对比表如下按主流程度排序垃圾回收器类型适用分代核心算法核心特点优点缺点适用场景JDK 支持版本G1 GCGarbage-First新生代老年代整堆标记-复制标记-整理1. 面向堆内存分区Region回收优先回收垃圾多的 Region2. 支持可预测的 GC 停顿时间通过-XX:MaxGCPauseMillis配置3. 混合回收同时回收新生代和老年代1. 低停顿、高吞吐量2. 无内存碎片3. 支持大内存场景实现复杂、对 CPU 资源消耗较高中大型应用、微服务、大内存场景堆内存 4GJDK 7u4 及以后JDK 9 默认Parallel Scavenge GC并行回收器新生代标记-复制1. 多线程并行回收默认线程数CPU核心数2. 优先追求高吞吐量而非低停顿3. 与 Parallel Old GC 配合使用老年代并行回收1. 吞吐量高CPU 利用率高2. 回收效率高、开销低停顿时间较长不适合实时性要求高的场景后台任务、批处理程序、数据计算等吞吐量优先场景JDK 1.4 及以后JDK 8 默认新生代回收器Parallel Old GC老年代标记-整理多线程并行回收与 Parallel Scavenge GC 配套使用吞吐量高、回收效率高停顿时间较长与 Parallel Scavenge GC 配合适用于吞吐量优先场景JDK 5 及以后CMS GCConcurrent Mark Sweep老年代标记-清除1. 并发回收大部分阶段与用户线程并行执行减少 STW 时间2. 分 4 个阶段初始标记→并发标记→重新标记→并发清除停顿时间极短、实时性高1. 内存碎片严重2. 并发阶段占用 CPU 资源影响业务执行3. 无法处理浮动垃圾实时性要求高的场景如电商交易、金融服务JDK 1.5 及以后JDK 9 标记为废弃JDK 14 移除ParNew GC新生代标记-复制多线程并行回收与 CMS GC 配套使用唯一支持 CMS 的新生代回收器回收效率高、支持与 CMS 配合使用停顿时间较长吞吐量低于 Parallel Scavenge GC与 CMS GC 配合适用于实时性要求高的场景JDK 1.4 及以后Serial GC串行回收器新生代标记-复制单线程回收回收期间暂停所有用户线程STW实现简单、资源消耗低CPU/内存停顿时间极长、效率低小型应用、客户端应用、测试环境堆内存 1G所有 JDK 版本Serial Old GC老年代标记-整理单线程回收与 Serial GC 配套使用实现简单、无内存碎片停顿时间极长小型应用、测试环境或作为 CMS GC 失败的兜底回收器所有 JDK 版本ZGC / Shenandoah GC新生代老年代整堆标记-复制颜色指针1. 几乎无停顿STW 时间毫秒级2. 支持超大内存百G级3. 并发回收对业务影响极小极低停顿、支持超大内存、高吞吐量对 CPU 要求高、生态不够成熟超大型应用、实时性要求极高的场景如金融核心交易、大数据处理ZGCJDK 11、Shenandoah GCJDK 124. GC 触发条件不同类型的 GCMinor GC、Major GC、Full GC触发条件不同具体如下表GC 类型核心触发条件回收区域停顿时间回收频率Minor GC新生代 GC1. 新生代 Eden 区内存不足无法分配新对象2. 大对象直接分配失败罕见新生代EdenS0短高Major GC老年代 GC1. 老年代内存不足无法分配对象如新生代对象晋升老年代失败2. 方法区元空间内存不足触发老年代回收老年代长低Full GC全局 GC1. Major GC 执行后内存仍不足2. 调用System.gc()建议性触发JVM 可忽略3. 堆内存或元空间内存溢出前的最后一次回收4. CMS GC 出现内存碎片无法分配大对象新生代老年代元空间最长最低5. 内存溢出OOM实战示例1堆内存溢出最常见importjava.util.ArrayList;importjava.util.List;// 堆内存溢出不断创建对象并保存引用导致堆内存不足publicclassHeapOOMDemo{staticclassOOMObject{}publicstaticvoidmain(String[]args){ListOOMObjectlistnewArrayList();// 无限创建对象直到堆内存溢出while(true){list.add(newOOMObject());}}}// 运行参数-Xms20m -Xmx20m -XX:HeapDumpOnOutOfMemoryError// 异常信息java.lang.OutOfMemoryError: Java heap space2虚拟机栈溢出栈深度超限// 虚拟机栈溢出无限递归调用导致栈深度超过最大限制publicclassStackOverflowDemo{privateintstackDepth0;publicvoidrecursiveCall(){stackDepth;// 无限递归recursiveCall();}publicstaticvoidmain(String[]args){StackOverflowDemodemonewStackOverflowDemo();try{demo.recursiveCall();}catch(Throwablee){System.out.println(栈深度demo.stackDepth);e.printStackTrace();}}}// 异常信息java.lang.StackOverflowError五、总结与生产实践建议类加载机制核心要点类加载核心流程为「加载→验证→准备→解析→初始化」仅主动使用类才会触发初始化双亲委派模型保障类的唯一性和安全性自定义类加载器优先重写findClass()而非loadClass()避免破坏双亲委派类卸载需满足三个条件否则会导致方法区元空间内存泄漏。运行数据区核心要点线程私有区域生命周期与线程一致线程共享区域生命周期与 JVM 一致堆采用分代存储新生代用标记-复制算法老年代用标记-整理算法JDK 8 元空间替代永久代存储在本地内存需通过-XX:MaxMetaspaceSize限制最大内存。垃圾回收核心要点可达性分析算法是 JVM 默认的对象可回收判断算法GC Roots 是核心根节点分代收集算法是默认回收算法G1 GC 是 JDK 9 默认回收器兼顾低停顿和高吞吐量避免频繁 Full GC减少 STW 对业务的影响优先通过调优参数优化如调整堆大小、回收器参数。生产实践调优建议堆内存配置-Xms初始堆内存与-Xmx最大堆内存设置为相同值避免内存动态扩展的开销建议为物理内存的 1/4~1/2回收器选型中大型应用优先选 G1 GC吞吐量优先场景选 Parallel ScavengeParallel Old实时性优先场景JDK 11选 ZGC内存溢出排查通过-XX:HeapDumpOnOutOfMemoryError生成堆转储文件使用 MATMemory Analyzer Tool分析内存泄漏点避免手动调用System.gc()该方法仅为建议性触发可能导致不必要的 Full GC。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

单网站建设wordpress自定义

SteamAchievementManager离线成就管理:断网环境下的快速上手指南 【免费下载链接】SteamAchievementManager A manager for game achievements in Steam. 项目地址: https://gitcode.com/gh_mirrors/st/SteamAchievementManager 你是否曾因网络问题无法管理游…

张小明 2026/1/10 10:44:01 网站建设

flash网站建设教程视频wordpress哪种主页更利于seo

PyTorch安装包冲突?Miniconda-Python3.11精准依赖管理 在现代AI开发中,你是否经历过这样的场景:刚写完一个模型训练脚本,准备运行时却发现 torch.cuda.is_available() 返回了 False;或者团队成员都说“我这边能跑”&a…

张小明 2026/1/10 10:44:01 网站建设

nas可以做网站下载服务器吗北京想象力网站建设公司

Docker Commit 保存修改:Miniconda-Python3.9 定制化后再发布 在高校实验室或中小型 AI 团队中,你是否经常遇到这样的场景?新成员刚加入项目,花了一整天时间配置 Python 环境、安装 PyTorch 和 JupyterLab,结果还是因为…

张小明 2026/1/9 16:31:44 网站建设

网站建设的安全性问题华为网站建设建议

目录 网络安全现状分析关于网络安全入门网络安全行业特点 1、就业薪资非常高,涨薪快2、人才缺口大,就业机会多3、行业发展空间大,岗位非常多4、职业增值潜力大 学习计划 阶段一:初级网络安全工程师阶段二:中级or高级网…

张小明 2026/1/10 10:44:03 网站建设

株洲网站的建设济南房产网签查询

深入LPC2138:ARM7内核与外设协同的底层逻辑全解析在嵌入式开发的世界里,我们常被各种“现代”框架和抽象层包围——RTOS、HAL库、设备树……但当你真正深入硬件细节时,会发现一切的根基,其实都藏在那些看似陈旧却无比坚实的芯片中…

张小明 2026/1/9 14:37:45 网站建设

啥网站都能看的浏览器华为网站搭建

型号介绍:今天我要向大家介绍的是 TAIYOU 的一款电容器——TMK325ABJ476MM-P。 它拥有47uF的大容量能有效平滑电源波动,25V的额定电压覆盖了多数通用设备的工作范围,而X5R温度特性确保在-55℃至85℃环境下性能稳定。更让他满意的是1210/3225的…

张小明 2026/1/10 5:03:05 网站建设