每日一问
未读
【每日一问】请问浮动垃圾是如何产生的
浮动垃圾主要在并发标记过程中产生,由以下两种情况导致:一是方法运行结束后,GC Root被销毁,但其引用的对象之前已被扫描标记为非垃圾对象,导致本轮GC无法回收;二是基于“原始快照”机制,灰色对象删除白色对象引用时会被记录,并在后续扫描中将白色对象标记为黑色。这两种情况均使得本该回收的内存被遗漏,留待下一轮GC处理。
每日一问
未读
【每日一问】方法区垃圾回收,如何判断一个类是无用的类?
在方法区垃圾回收中,判断一个类是否为无用类需同时满足三个条件:首先,该类的所有实例均已被回收,即Java堆中不存在该类的任何实例;其次,加载该类的ClassLoader已被回收;最后,该类对应的java.lang.Class对象未被任何地方引用,且无法通过反射访问其方法。这些条件必须全部成立,类才能被视为无用,从而可能被安全卸载以释放内存资源。
每日一问
未读
【每日一问】JVM有哪些垃圾回收算法?
JVM垃圾回收算法包括四种:标记-清除算法通过标记无用对象后清除回收,但效率不高且易产生内存碎片;标记-复制算法将内存分为两区,复制存活对象后清理,内存使用率仅半;标记-整理算法标记后移动存活对象并清理边界外内存,避免碎片;分代算法根据对象存活周期分新生代和老年代,新生代采用复制算法,老年代采用标记整理算法,优化回收效率。这些算法各有优缺点,分代算法是常用组合。
每日一问
未读
【每日一问】说说java虚拟机运行时数据区
Java虚拟机规范规定的运行时数据区分为5个部分。程序计数器是当前线程字节码行号指示器,支撑分支、循环等基础功能;Java虚拟机栈存储局部变量表、操作数栈、动态链接及方法出口等信息;本地方法栈类似虚拟机栈,服务于Native方法;Java堆是最大内存区域,所有线程共享,用于分配对象实例;方法区存储类信息、常量、静态变量及即时编译后的代码等数据。
Java
未读
【JVM篇】从源码角度分析JVM类加载机制
本文系统阐述了JVM的跨平台实现原理、Java编译过程及类加载机制。JVM通过将Java源码编译为平台无关的字节码(.class文件),再由各平台JVM解释或编译为本地机器码执行,实现“一次编译,到处运行”。javac编译过程包括词法分析、语法分析、语义分析、解语法糖等八个阶段,生成符合JVM规范的字节码。类加载子系统负责加载、验证、准备、解析和初始化类,采用双亲委派机制(Bootstrap/Extension/Application类加载器)确保类唯一性和安全性,避免核心库被篡改。特殊场景如Tomcat需打破双亲委派,通过自定义类加载器实现Web应用隔离和热部署。
每日一问
未读
【每日一问】java创建对象的过程
Java创建对象的过程包括五个关键步骤:首先,JVM遇到new指令时进行类加载检查,确保类已加载、解析和初始化;未加载则先执行类加载。其次,分配内存:内存大小在类加载后确定,根据堆内存规整情况选择指针碰撞(用于规整堆,关联Serial/ParNew GC)或空闲列表(用于不规整堆,关联CMS GC)方式。接着,初始化内存为默认值,保证字段在未赋值时可用。然后,设置对象头,记录类实例、hash码、年龄段等基本信息。最后,执行开发人员编写的初始化方法,完成对象创建。整个过程确保对象安全高效地构建。
每日一问
未读
【每日一问】jvm优化原则是什么
JVM优化的核心原则是减少FullGC以最小化Stop-The-World(STW)时间,因为FullGC的STW远长于YoungGC。这通过让对象尽可能在新生代分配和回收实现,避免频繁进入老年代。对象进入老年代有四个条件:1)存活对象达到年龄阈值(默认15,可调);2)大对象直接进入(超过参数设置);3)动态对象年龄判定(Survivor区年龄总和超半时,年龄较大对象进入);4)Young GC后Survivor空间不足。优化建议:避免创建大对象,尤其是朝生夕死的大对象,并确保Survivor区足够大,使YGC后存活对象不超过其一半,从而有效减少FullGC次数和时间。
每日一问
未读
【每日一问】讲一下 JVM 的主要组成部分及其作用?
JVM包含两个子系统和两个组件:两个子系统为Class loader(类装载)、Execution engine(执行引擎);两个组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。
每日一问
未读
【每日一问】Tomcat如果使用默认的双亲委派类加载机制行不行,为什么?
Tomcat作为web容器需解决四个核心问题:不同应用依赖不同版本类库需隔离;相同版本类库可共享以节省资源;容器类库与应用类库隔离确保安全;支持JSP热加载无需重启。默认双亲委派类加载机制无法满足需求,因其仅基于全限定类名加载,无法区分版本冲突,且JSP修改后无法重新加载(类名相同时直接复用)。解决方案是为每个应用或JSP文件使用独立类加载器,实现隔离、共享和动态更新,如卸载并重建JSP加载器以支持热部署。
Java
未读
Java 使用List的retainAll方法求交集
本文介绍了Java List的`retainAll`方法求交集的正确使用方式。该方法通过私有方法`batchRemove`实现:遍历当前集合,保留存在于参数集合中的元素,利用双指针和数组拷贝完成交集操作。关键点在于其返回值——它反映集合是否被修改(元素数量变化),而非是否存在交集:当两集合完全相同或无交集时,返回值分别为`false`和`true`。因此,正确判断交集应检查操作后集合大小是否大于0,而非依赖返回值。实现中通过`modCount`记录修改次数,确保操作安全性。

