JVM
文章平均质量分 75
programer_33
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
G1的SATB为什么比CMS增量标记快
SATB与CMS垃圾回收算法的性能差异主要体现在标记机制上。SATB采用初始快照方式,通过pre-write屏障记录旧值,标记范围固定且开销较小,适合大内存场景,停顿时间可控制在10ms内。CMS需要动态跟踪对象变化,维护卡表导致更高开销,标记时间与存活对象数正相关,4TB堆的停顿常超50ms。测试表明SATB比CMS减少50%以上标记停顿,尤其在大内存应用中优势明显。原创 2025-09-25 13:40:07 · 572 阅读 · 0 评论 -
GC 是任何时候都可以的吗?
GC垃圾收集器只能在安全点(Safepoint)进行,这是JVM中线程可以安全暂停的特定位置。安全点确保线程状态已知且一致,便于垃圾回收和堆栈遍历等操作。触发条件包括显式调用System.gc()或内存不足时被动触发。安全点通常设置在方法调用、循环跳转和异常抛出位置,以减少性能损耗。线程通过检查全局标志进入安全点暂停,等待GC完成。原创 2025-09-25 13:04:46 · 368 阅读 · 0 评论 -
内存分配策略
本文概述了JVM内存分配与回收机制:1)对象优先在Eden区分配,空间不足时触发MinorGC;2)区分MinorGC(回收新生代)与MajorGC/FullGC(回收老年代/全堆);3)大对象直接进入老年代以避免复制开销;4)通过年龄计数器实现长期存活对象晋升老年代;5)动态对象年龄判定机制允许提前晋升。这些机制共同优化了JVM内存管理效率。原创 2025-09-19 17:33:43 · 521 阅读 · 0 评论 -
Java对象什么时候会被移动到老年代
Java对象晋升老年代的主要条件包括:年龄阈值触发(默认15次MinorGC)、大对象直接分配、Survivor空间不足、动态年龄判定(同年龄对象超50%空间)和分配担保机制。关键参数有MaxTenuringThreshold(最大晋升年龄)、PretenureSizeThreshold(大对象阈值)和TargetSurvivorRatio(Survivor区利用率)。合理调整这些参数可优化GC行为,例如增大Survivor比例可减少秒杀场景下的FullGC。原创 2025-09-19 13:35:34 · 500 阅读 · 0 评论 -
内存泄漏与内存溢出
内存泄漏与内存溢出的区别与联系 内存泄漏指程序未能释放不再使用的内存,导致内存被无效占用,长期积累可能引发溢出。常见原因包括未关闭资源、静态集合未清理等。 内存溢出是程序申请内存时超出系统可用空间,常由单次申请过大或泄漏积累导致,表现为程序崩溃或抛出内存不足错误。 关键区别:泄漏是内存未被释放,溢出是内存不足;泄漏需长期积累才显现,溢出会即时触发错误。 解决方案:通过工具(如MAT、VisualVM)检测泄漏,优化代码逻辑;对于溢出,可调整内存参数或优化数据加载方式。原创 2025-09-18 22:26:46 · 687 阅读 · 0 评论 -
JVM 类加载机制
JVM 类加载机制是 Java 虚拟机将类文件(.class)加载到内存,并进行验证、准备、解析和初始化的过程。这一机制确保了类的正确性和安全性,同时支持动态加载和运行时绑定。用户可通过继承类实现自定义类加载器,用于特定场景(如热部署、模块化加载等)。需重写方法,而非以避免破坏双亲委派模型。@Override// 从自定义路径加载字节码// 实现从文件或网络加载字节码的逻辑。原创 2025-09-18 22:08:00 · 833 阅读 · 0 评论 -
JVM 内存区域
摘要:JVM内存区域分为线程私有和共享区域。私有区域包括程序计数器(记录字节码指令地址)、虚拟机栈(存储方法栈帧)和本地方法栈;共享区域包括堆(存储对象实例)、方法区(存储类信息)和运行时常量池。程序计数器是唯一不会内存溢出的区域,而其他区域在内存不足时可能抛出StackOverflowError或OutOfMemoryError。直接内存虽非JVM管理,但也会影响内存使用。不同虚拟机实现可能存在差异。原创 2025-09-18 21:45:36 · 853 阅读 · 0 评论 -
GC 算法的种类及垃圾收集器
标记-清除算法是最基础的垃圾回收算法,分为标记和清除两个阶段。标记阶段遍历所有可达对象并标记,清除阶段回收未被标记的对象内存。适用于内存碎片不敏感的场景,如早期Java虚拟机。缺点是会产生内存碎片,可能引发频繁的GC。原创 2025-09-18 21:28:08 · 890 阅读 · 0 评论
分享