JVM内存结构详解
发表于|更新于|Java
|浏览量:
JVM内存结构详解
概述
JVM内存结构分为五个部分:堆、栈、方法区、程序计数器和本地方法栈。
核心内存区域
堆(Heap)
- 线程共享,GC管理
- 存储所有对象实例
- 通过
-Xms、-Xmx调整大小
栈(JVM Stack)
- 线程私有
- 存储局部变量、操作数栈
- 通过
-Xss调整大小
方法区(Method Area)
- 线程共享
- 存储类信息、常量、静态变量
- JDK8+为MetaSpace
常见问题
Q: String s=”abc” 存在哪里?
A: 常量池(方法区)
Q: 栈和堆的区别?
A: 栈线程私有速度快,堆线程共享需要GC
Q: 创建对象的内存分配流程?
A: new对象 → 堆中分配 → 初始化 → 栈中引用指向
文章作者: kaii
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 kaii的博客!
相关推荐
2026-04-03
String字符串与常量池详解
String字符串与常量池详解概述String是Java中最重要的类,掌握其内存机制对于优化和避免常见陷阱至关重要。 String创建方式字面量方式123String s1 = "hello";String s2 = "hello";System.out.println(s1 == s2); // true new方式String s3 = new String(“hello”);String s4 = new String(“hello”);System.out.println(s3 == s4); // false 连接方式String s5 = “hello” + “world”; // 编译期优化String s6 = new String(“hello”) + new String(“world”); // 堆内存 常量池位置演变 JDK < 1.7:PermGen(方法区) JDK 1.7:堆内存 JD...
2026-04-03
线程池详解
线程池详解概述线程池是管理一组工作线程的机制,避免频繁创建销毁线程的开销。 核心参数ThreadPoolExecutor七大参数 corePoolSize:核心线程数 maximumPoolSize:最大线程数 keepAliveTime:非核心线程空闲超时时间 unit:时间单位 workQueue:任务队列 threadFactory:线程工厂 handler:拒绝策略 工作流程提交任务 → 核心线程数未满?→ 创建核心线程 → 队列未满? → 加入队列 → 线程数未满? → 创建非核心线程 → 执行拒绝策略 拒绝策略 AbortPolicy:抛出异常(默认) CallerRunsPolicy:调用线程执行任务 DiscardPolicy:直接丢弃 DiscardOldestPolicy:丢弃最老任务,加入新任务 线程池大小选择 CPU密集型:线程数 = CPU核心数 + 1 IO密集型:线程数 = CPU核心数 × (1 + IO等待比) 常见问题Q: 为什么先填满队列再创建非核心线程?A: 减少线程数,降低线程切换开销和内存占用 Q: keepA...
2026-04-03
Java HashMap 底层实现原理详解
HashMap 底层实现原理详解一、数据结构HashMap 基于 数组 + 链表 + 红黑树 的数据结构实现: 数组:存储 Node 对象的数组,初始容量为 16 链表:当哈希冲突时,使用链表存储多个 Node 红黑树:链表长度 > 8 时,链表转换为红黑树(JDK 1.8+) 二、关键参数 参数 说明 capacity 容量,默认16,必须是2的幂次方 loadFactor 负载因子,默认0.75 threshold 扩容阈值 = capacity × loadFactor size 当前存储的键值对个数 三、哈希冲突解决链地址法: 计算 hash 值:hash = key.hashCode() ^ (key.hashCode() >>> 16) 计算桶位置:index = (n - 1) & hash(n为容量) 相同 index 的元素形成链表 四、常见问题Q:为什么容量必须是2的幂次方? 使用 & 运算效率高于 % 运算 保证 (n - 1) & hash 的结果均匀分布 Q:...
2026-04-03
ConcurrentHashMap详解
ConcurrentHashMap详解概述ConcurrentHashMap是线程安全的HashMap,通过分段锁实现高效的并发访问。 HashMap vs ConcurrentHashMap HashMap:非线程安全,性能高 ConcurrentHashMap:线程安全,通过分段锁/Node级锁实现 JDK1.7 - 分段锁设计 结构:Segment数组 + HashEntry链表 默认16个Segment,多线程可同时访问不同Segment 优点:并发度高 缺点:获取size()需遍历所有Segment JDK1.8+ - CAS+Synchronized 结构:Node数组 + 红黑树 + CAS 只对单个Node加锁,粒度更细 CAS无锁操作性能更高 支持红黑树优化查询性能 put方法逻辑计算hash值 → 定位Node → Node为空CAS插入 → Node存在synchronized加锁 → 链表/树操作 常见问题Q: ConcurrentHashMap是否完全线程安全?A: 单个操作线程安全,但复合操作需要外部同步 Q: 为什么使用vo...
2026-04-03
垃圾回收算法详解
垃圾回收算法详解概述垃圾回收是JVM自动管理内存的机制,主要有四种算法。 核心算法标记-清除(Mark-Sweep) 分两阶段:标记可达对象、清除未标记对象 优点:算法简单 缺点:产生内存碎片 复制算法(Copying) 内存分为两个等大小区域,存活对象复制到另一个区域 优点:无内存碎片 缺点:浪费一半内存,适用于新生代 标记-整理(Mark-Compact) 标记可达对象,将存活对象压缩到一端 优点:无碎片,内存利用率高 缺点:算法复杂,需要移动对象 分代收集(Generational Collection) 新 代用复制算法,老年代用标记-整理算法 基于假设:新生对象易死,老年对象难死 常见问题Q: 为什么新生代用复制,老年代用标记-整理?A: 新生代对象存活率低适合复制,老年代存活率高不浪费空间 Q: 什么是GC停顿?A: GC运行时JVM暂停所有用户线程(Stop The World) Q: 如何减少GC停顿时间?A: 使用低延迟收集器如G1GC、ZGC
公告
欢迎来到我的博客!
记录学习与生活
记录学习与生活
