随笔分类 - Java
摘要:排名 命令行命令 / 参数 功能描述 例子 1 java 启动JVM。运行Java应用程序的最基础入口。 java com.example.Main 2 javac 编译源码。将 .java 文件编译为 .class 字节码。 javac User.java 3 jps 查看Java进程。列出本地运
阅读全文
摘要:参考 https://www.cnblogs.com/binlovetech/p/16449538.html 对象 = 对象头 + 实例数据 + padding 对象头 = Mark Word + 类型指针KlassOop Mark Word = hashcode + GC分代年龄 + 锁状态标志
阅读全文
摘要:总结 优雅停机(Graceful Shutdown)= ** “拒接新客 + 善待老客 + 妥善交接” **。 它要求 JVM 进程在接收到外部关闭指令时,不再接收任何新的外部请求, 但必须保证当前正在线程池中处理的业务逻辑执行完毕, 并安全释放底层资源(如数据库长连接、文件句柄、自定义线程池、MQ
阅读全文
摘要:点击运行到手动关闭期间发生了什么? 总结 Spring Boot 生命周期概括:从点击启动到关闭,本质上是一个“环境准备 -> 创建 Spring 容器 -> 启动内嵌 Tomcat -> Bean 实例化与依赖注入 -> 接收请求 -> 优雅停机与资源销毁”的串行流水线。 详细原理 1. 为什么
阅读全文
摘要:堆中的每个对象都是一个链条的开端 以堆中的一个对象person1为视角: person1 实例 (堆) ➔ InstanceKlass (元空间) ➔ Person.class (堆) ➔ ClassLoader (堆) ➔ 全部 Class 镜像 (堆) ➔ 全部类元数据 (元空间)。 堆中的对象
阅读全文
摘要:埋下隐患: 你在代码中使用了 ThreadLocal<UserContext> 来保存当前请求的用户上下文信息。但是,你的初级同事在拦截器里**忘记写 ThreadLocal.remove()** 来清理数据了。 容器架构: Tomcat 为了处理高并发,维护了一个长生命周期的“工作线程池”。这些线
阅读全文
摘要:JVM内存:堆中的对象实例与元空间中的类元信息是什么关系? 结论 在 JVM 的设计哲学中,数据(状态)与指令(行为)被严格分离。类的加载是一个“双管齐下”的过程:底层 C++ 结构的类元数据存入元空间,而供 Java 开发者操作的 Class 镜像对象存入堆内存。无论堆中产生多少个该类的普通对象实
阅读全文
摘要:要点概括 参数配置:-Xms 与 -Xmx 必须对齐,杜绝动态扩缩容开销。容器部署时,-Xmx 绝对不能等于容器内存上限。 分配机制:对象不全在堆上。开启逃逸分析后,局部未逃逸对象会通过标量替换在栈上分配,无 GC 负担。 排查 SOP:线上 OOM 的标准处理顺序是:参数兜底自动 Dump ->
阅读全文
摘要:JVM 启动参数或应用配置参数(以 -D开头的是 Java 系统属性配置),用于指定 Redis、Nacos、Kafka、Elasticsearch 等中间件的连接信息和内存配置等。 IDEA将配置的启动参数存储到.idea/目录下,在启动服务时将参数传递给JVM,替换项目中.yaml、.prope
阅读全文
摘要:/** * 单例模式 * 方式7 */ public enum SingletonEnum { INSTANCE; } 这个写法虽然看起来最简单(只有一行代码),但它背后的原理其实非常深刻。它是《Effective Java》作者 Josh Bloch 官方推荐的单例模式最佳实现方式。 1. INS
阅读全文
摘要:/** * 单例模式 * 懒汉式 方式6 静态内部类 * 优点:利用JVM类加载机制保证延迟加载和线程安全。 */ public class SingletonInnerClass { // 1、私有构造方法 private SingletonInnerClass() {} private stat
阅读全文
摘要:/** * 单例模式 * 饿汉式 方式2 静态代码块 * 缺点:实例instance随类的加载而被创建,一直不用会造成内存浪费。 */ public class SingletonEager { // 1、私有化构造方法 private SingletonEager(){} // 2、声明一个对象
阅读全文
摘要:/** * 懒汉式 方式6 双重检查锁 */ public class SingletonLazy { // 1、私有构造方法 private SingletonLazy(){} // 2、在成员变量位置声明一个静态对象 private static volatile SingletonLazy i
阅读全文
摘要:float占4字节,long占8字节,第一反应是long的取值范围更大。 不然,因为二者存储数的方式不同,float采用科学计数法存储,long直接用二进制形式存储数。 long占8字节,64位中最高一位是符号位,表示的最大数是2^63 - 1。 float占4字节,32位分为3个字段: 符号位 (
阅读全文
摘要:内容由AI生成 Java 基础避坑与原理:Scanner、泛型与 ArrayList(含源码验证) 1. Scanner 的“回车符”陷阱 现象: 在使用 Scanner 时,如果先调用 nextInt(),紧接着调用 nextLine(),第二个字符串输入会直接跳过(读到空字符串)。 int nu
阅读全文
摘要:内容由AI生成 一、 泛型(Generics)与类型擦除 现象: 为什么写 ArrayList<int> 编译器会报错,必须写 ArrayList<Integer>? 1. 核心考点:类型擦除 (Type Erasure) 面试回答: Java 的泛型是伪泛型,是在编译器层面实现的。在编译后的字节码
阅读全文
摘要:为什么 nextInt() + nextLine() 会出问题,以及底层的原理。 1. 核心原因:回车符(\n)的残留 计算机处理键盘输入时,有一个输入缓冲区(Buffer)。 当输入数字 10 并按下回车键时,输入缓冲区里的内容实际上是: 10\n (10 是你输入的数字,\n 是回车键产生的换行
阅读全文
摘要:int → String 转换的 API 1. String.valueOf(int i) (推荐) int num = 123; String s = String.valueOf(num); // "123" 优点:最常用,代码清晰,性能好 null安全:如果传入 null 会返回 "null"
阅读全文
摘要:Java内部类与静态上下文 错误示例 public class Outer { class Inner { // 普通内部类 int value; Inner(int v) { value = v; } } public static void main(String[] args) { Inner
阅读全文
摘要:参考 1、什么是内存对齐? char c; int a; 非内存对齐:在内存中,变量c后紧跟着变量a。 2次寻址操作 + 1次合并操作才能读取变量a的值。 内存对齐:假设CPU一次读取4个字节,变量c后空出3个字节,再存储变量a。 1次寻址操作便能读取变量a的值。 2、为什么有内存对齐? (1)硬件
阅读全文

浙公网安备 33010602011771号