IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:JVM

共 18 篇相关文章

IT 累计浏览 2,326

《Effective java》—–读书笔记

读完《Effective Java》后,作者结合自己的面试反思与年度学习计划,写下这篇笔记,摘录并梳理了书中多条核心原则。笔记从创建对象讲起,强调了静态工厂方法的优势、避免创建不必要对象以及如何通过私有构造器或枚举强化单例。接着,重点讨论了类与接口设计:最小化可访问性、为不可变性努力、优先使用组合而非继承、以及如何用接口定义类型和用骨架实现类弥补抽象类的不足。 在方法层面,笔记总结了慎用重载和可变参数、返回零长度数组而非null等实用建议。通用编程部分则归纳了最小化局部变量作用域、优先使用for-each循环和基本类型等性能与可读性并重的技巧。最后,笔记也提到了异常处理的原则——异常应只用于异常情况。 这些笔记摘录不仅保留了原著的精华论点,还结合了博主自己的理解,如通过WeakHashMap管理缓存、继承判断的“is-a”原则等,将“四大圣经”之一的实践智慧转化为开发者可直接参考的要点清单。

IT 累计浏览 4,231

JVM内存结构

这篇讲的是JVM内存结构的核心组成与关键细节。文章清晰地梳理了Java虚拟机运行时所管理的五大内存区域:堆、方法区、PC寄存器、方法栈和本地方法栈。它不仅解释了每个区域的职责——比如堆用于存放对象实例并分代管理,方法区存储类信息与常量——还深入对比了它们在线程共享与私有、垃圾回收策略以及异常抛出方面的差异。 文章特别指出了Java 8中方法区的重大变迁,即Metaspace替代了永久代,这是一个重要的版本演进知识点。同时,为每个区域都列出了常用的JVM调优参数(如-Xms, -Xmx, -Xss)和对应的OutOfMemoryError或StackOverflowError场景,使得理论立刻能与实践中的故障排查相结合。 对于需要理解内存分配原理、或正面临OOM问题的开发者而言,这篇文章提供了一份结构化的全景图和实用的参数指南,能有效帮助建立起从代码到虚拟机内部运行的直观认知。

IT 累计浏览 2,524

Java -- Hotspot虚拟机调优与GC垃圾回收策略

这篇讲的是Java HotSpot虚拟机如何进行性能调优,核心是理解并优化其垃圾回收(GC)机制。作者从Java与C/C++的常见争论切入,指出Java在动态优化方面的特性,引出对JVM和GC进行研究的必要性。 文章首先详细图解了JVM的堆内存分区:Eden、Survivor、老年代和持久代,解释了各区域的用途。接着,重点剖析了GC的核心流程与算法,从经典的引用计数法和Java实际采用的根搜索法说起,对比分析了标记-清除、复制(用于新生代)、标记-整理(用于老年代)等回收算法的原理与优缺点,特别阐述了它们如何协同工作以平衡效率与内存碎片问题。 最后,文章落脚于实践,列举了如-XX:-DisableExplicitGC、-XX:+UseConcMarkSweepGC等一系列关键的JVM启动参数,并结合Full GC与Young GC的特点,提供了具体的调优方向与性能优化Tips,帮助开发者从理论到实践全面掌握GC调优。

IT 累计浏览 2,326

垃圾收集器选择

这篇讲的是JVM垃圾收集器的核心选择问题。作者从JDK版本演进切入,指出在串行收集器只适用于小数据量的前提下,真正的选择主要发生在并行收集器与并发收集器之间。 文章清晰地梳理了两者的定位与典型配置。吞吐量优先的并行收集器(如UseParallelGC),通过最大化处理器利用率来服务后台批处理任务,并提供了调整GC线程数、暂停时间及自适应策略等关键参数。而响应时间优先的并发收集器(如UseConcMarkSweepGC),则致力于最小化应用停顿,更适合在线服务场景。文章也具体指出了像-XX:+UseConcMarkSweepGC可能会导致-XX:NewRatio失效,以及如何通过参数处理并发收集器产生的内存碎片问题。 它不仅给出了“是什么”和“为什么”,更提供了“怎么配”的实战代码示例。无论你是在做科学计算需要高吞吐,还是运营在线系统要求低延迟,都能从中找到明确的调优方向和参数依据。

IT 累计浏览 3,706

JAVA虚拟机简介

这篇讲的是Java虚拟机(JVM)的基础全景。文章开门见山,帮读者厘清“JVM”这个词的多层含义:它既是一套定义行为的规范,又是如HotSpot这样的具体实现,同时也是程序运行时的一个独立实例。这种分层解读,有助于跳出“JVM就是一个黑盒”的模糊认知。 接着,文章厘清了开发者日常接触的“三件套”:JVM负责执行字节码,JRE包含了JVM和核心类库,而JDK则在JRE之上增添了开发工具。理清它们的包含关系,是理解Java技术体系的第一步。 文章后半部分聚焦JVM内部,通过图解展示了其基本结构,重点剖析了类加载子系统。它详细拆解了Bootstrap、Extension、App和Custom这四层类加载器的职责与分工,特别是指出了启动类加载器由C++实现、无法被Java程序直接引用的特殊性。 对于刚接触Java底层原理的开发者而言,这篇文章像一份清晰的地图,系统性地梳理了从宏观概念到核心模块的关键知识点,为后续深入探索内存模型、垃圾回收等打下了扎实的基础。

IT 累计浏览 4,473

Jetty线程“互锁”导致数据传输性能降低问题分析

这篇讲的是在Jetty 7.2.1这个特定版本中,一个会导致数据传输性能降低的“互锁”问题。作者从Jetty经典的NIO异步反映器模型入手,分析了主线程(selector)与子线程(工作线程)之间的一种微妙配合失误。 问题的核心在于,当子线程遭遇网络拥塞、缓冲区写满时,它会进入阻塞状态并向主线程注册一个内部事件,等待拥塞解除的通知。然而,主线程的select循环在等待selector的网络事件时,可能并未及时轮询和处理这些内部事件,导致子线程无法被唤醒,形成“互锁”,拖累了整体性能。 文章通过拆解具体的代码逻辑,清晰地展示了这种线程间交互的瓶颈点。最终,作者指出了相应的解决或规避思路,比如合理设置超时参数,以帮助开发者在类似场景下优化配置,避免性能陷阱。

IT 累计浏览 3,900

JVM的GC简介和实例

这篇文章从JVM内存布局讲起,重点剖析了Java堆的分代模型——新生代如何划分Eden与Survivor区,以及Minor GC触发时基于复制算法的运作机制。作者通过一段简单代码和jstat监控,演示了在默认配置下,新对象如何优先在Eden区分配,当Eden空间不足时如何触发一次Minor GC,以及部分存活对象如何被直接晋升到老年代。整个过程配合真实的GC日志进行了拆解。 文章还简要介绍了Serial、ParNew、CMS等常见的垃圾收集器,并利用JVM参数(如-Xmn、-XX:SurvivorRatio)调整新生代配置,为后续对比不同收集器的行为埋下伏笔。它并非泛泛而谈理论,而是将“对象优先在Eden分配”、“大对象直接进入老年代”等原则,用可观察的内存变化和日志数据做了印证。对于想理解GC基本行为,或对“Minor GC后对象为何直接进入老年代”感到困惑的初学者,这份实战记录提供了清晰的图示和数据支撑。

IT 累计浏览 3,882

JVM垃圾收集器

这篇讲的是JVM中垃圾收集器的原理与选型。作者从垃圾收集是算法的具体实现出发,系统梳理了JDK 1.6时代的六种主流收集器。 文章的核心在于对比。它首先指出没有万能收集器,只有最合适的。Serial作为单线程基础款,适合客户端;ParNew是其多线程升级版,主要为了配合CMS;Parallel Scavenge则专注于吞吐量,适合后台计算任务。在老年代,Serial Old是单线程整理,Parallel Old实现了多线程整理以贯彻高吞吐思路。 重点落在两种并发收集器上。CMS以最短停顿为目标,通过并发标记清除实现,但面临CPU敏感、浮动垃圾和空间碎片问题。G1则带来了革命性改进:基于标记-整理,不产生碎片;通过将堆划分为多个Region并优先回收垃圾最多的区域,实现了可预测的、精确的停顿时间控制。 文章结合图示,清晰地展示了各收集器的适用年代、组合方式以及从Serial到G1,用户线程停顿时间不断缩短的发展脉络,为理解JVM内存管理提供了扎实的入门图景。

IT 累计浏览 3,244

JVM内存分配与回收策略

这篇讲的是JVM中对象内存分配的“潜规则”,作者从最基础的规则出发,通过具体的代码示例和GC日志,带你看清内存分配的真实行为。 文章核心围绕三个关键策略展开:一是对象优先在Eden区分配,当Eden空间不足时就会触发Minor GC;二是大对象会绕过新生代,直接被“安置”在老年代,这可以通过`-XX:PretenureSizeThreshold`参数来控制;三是长期存活的对象会从新生代“晋升”到老年代,其阈值由`-XX:MaxTenuringThreshold`决定。 作者并没有停留在理论描述,而是为每个规则都准备了可运行的代码和对应的GC输出日志。比如,通过对比设置`MaxTenuringThreshold`为1和15时不同的GC结果,你能直观地看到对象年龄计数器如何影响晋升行为。这种用实验数据说话的方式,让这些抽象的内存管理机制变得非常具体和可验证。

IT 累计浏览 3,628

JVM垃圾收集算法

这篇系统梳理了JVM垃圾回收中几种核心算法的思路与权衡。文章从最基础的“标记-清除”算法切入,指出了它虽简单却有效率低下与内存碎片两大硬伤。为解决效率,“复制算法”以空间换时间,通过内存分区和存活对象拷贝来运行,但代价是内存减半;不过,结合新生代“98%对象朝生夕死”的特性,现代虚拟机巧妙调整了Eden与Survivor区的比例,将浪费降至10%。 针对老年代对象存活率高、无法浪费空间的场景,“标记-整理”算法则另辟蹊径:标记后让所有存活对象向一端移动,从而整理出连续内存空间。最后,文章点明了当今主流的做法——“分代收集”,它并非新算法,而是根据新生代与老年代的不同特点(对象存活率、空间担保需求等),灵活组合采用上述策略,以达到整体最优的回收效果。整篇文章对比清晰,从算法原理到工程实现,为理解JVM内存管理提供了扎实的脉络。

IT 累计浏览 2,746

Clojure世界:如何做性能测试

测量性能是开发中的常见需求,这篇文章就专门聊了聊在Clojure里这件事该怎么做。 作者从大家熟悉的Java、Ruby的测量方式讲起,自然引出Clojure的实践。在Java中,我们可能会循环调用并手动记录时间;Ruby则有Benchmark模块提供详尽报告。而Clojure,同样可以沿用`System.currentTimeMillis()`这类基础方法进行粗粒度的测量。 这篇文章的核心,正在于展示了如何将已有的经验迁移到新语言生态。它没有停留在语法层面,而是点明了性能测试背后的通用逻辑:无论语言如何变化,测量的核心思路——计时与执行——是相通的。对于已经掌握其他JVM语言或动态语言的开发者,这相当于提供了一份快速上手的指南。 掌握了这种“从已知到未知”的学习路径,你就可以更顺畅地在Clojure中开始自己的性能探查,并为后续使用更专业的工具打下基础。

IT 累计浏览 3,567

Eclipse Xtend对Java说:我帮你瘦身

这篇文章讲的是 Eclipse 基金会推出 Xtend 语言,旨在为冗长的 Java 语法“瘦身”。作者从 Bruce Tate 在《七周七语言》中对 Java 冗余代码的生动批评切入,引出了这个与 Eclipse IDE 紧密集成的解决方案。 Xtend 的核心思路是作为 Java 的“模板语言”,它编写的代码在 IDE 中保存时会自动转译为对应的 Java 代码。文章重点展示了 Xtend 如何简化日常编码:比如通过类型推测省略显式类型声明,用 `person.name` 直接访问属性替代 `getName()` 调用,以及让 `switch` 语句支持更复杂的对象匹配。此外,它还引入了方便的多行字符串模板和强大的闭包语法,让代码更接近 Ruby 等脚本语言的简洁风格。 Xtend 的价值在于,它允许开发者在熟悉的 Java 生态和现有项目基础上,享受更高效、更富表现力的编码体验,无需完全切换到新语言。对于追求生产力又希望保持技术栈稳定的 Java 开发者而言,这是一个值得考虑的“语法增强”工具。

IT 累计浏览 2,377

Scala很难

这篇文章坦承了一个许多开发者心照不宣的感受:Scala很难。但它并非在抱怨,而是从这个起点出发,探讨这种“难”究竟从何而来,又是否必要。作者认为,Scala的复杂性与其追求的目标——同时提供强大的静态类型系统、函数式编程范式以及无缝的Java互操作性——密不可分。这种复杂并非为了炫技,而是为了在JVM平台上提供一种更可靠、更可组合的软件构造方式。 文章深入剖析了Scala让人望而生畏的几个核心:如复杂的类型推断和隐式转换机制,这确实抬高了入门门槛;同时,它又融合了面向对象与函数式编程,要求开发者转换思维模式。作者指出,这道陡峭的学习曲线背后,是代码健壮性、表达力和可维护性的显著提升,尤其在构建大型、关键的系统时。 所以,这篇文章讲的不是一个简单的“难”字,而是将Scala的复杂性放在其设计哲学与工程价值的天平上重新审视。它启发读者思考:在追求开发效率与代码简洁时,我们愿意为长期的工程严谨性付出怎样的初始成本?对于正在评估技术栈或苦于Scala学习的团队而言,这提供了一个非常务实的视角。

IT 累计浏览 2,887

记录帖:碰到的一些Java问题

这是一篇来自一线开发者的实战记录帖,汇集了几个典型的Java问题排查案例。文章以问题驱动,详细复现了从现象到根因的完整思考路径。 其中令人印象深刻的是集群启动失败的案例:相同的应用包和环境,部分节点却抛出NoClassDefFoundError。作者借助btrace追踪类加载器,最终发现是因为不同Linux节点上`File.listdir`返回的文件顺序(按inode号排序)存在差异,导致两个同名但内容不同的jar中的类被加载到了不同的地方,引发了冲突。这个发现揭示了一个隐蔽而常见的Java模块加载陷阱。 此外,文章还涵盖了GC频繁但不触发OOM的调优困境、堆外内存泄露(通常与Deflater未释放有关)的定位方法、压测时因第三方线程池配置不足导致的压力瓶颈,以及因未正确处理外部进程的标准输出/错误流而引发的应用死锁。 这些案例的价值在于,它们不仅仅给出了“怎么做”,更分享了“为什么这么想”和“过程中踩到了什么坑”,比如放弃`-XX:+TraceClassLoading`的原因,或是从网卡流量、线程状态逐步缩小排查范围的思路。对于遇到类似问题的开发者,这是一份可以直接参考的排查手册。

IT 累计浏览 5,116

Java 6 JVM参数选项大全(中文版)

这篇系统梳理了Java 6 JVM所有非稳态参数选项的实用指南。作者基于SUN官方文档进行翻译,并补充了大量背景资料与原理阐释,旨在帮助开发者深入理解每个参数的含义与适用场景。 文章清晰区分了参数的使用语法(如-XX:+启用、-XX:-关闭),并详细列举了行为选项与性能选项。对于每个选项,不仅说明了默认值与平台限制,更通过关联知识点揭示了其底层逻辑。例如,在解释新生代收集担保(-XX:+HandlePromotionFailure)时,文章剖析了Minor GC的运作机制与担保策略的利弊;在介绍自旋锁优化(-XX:+UseSpinning)时,则联系了CAS与OS互斥锁的原理。 这份文档覆盖了垃圾收集器选择(如CMS、Parallel GC)、内存管理、类加载校验、线程优化及特定平台(如Solaris)设置等多个关键调优维度。对于正在进行JVM性能优化或需要精确控制运行时行为的工程师而言,它将是一份内容扎实的中文参考手册。

IT 累计浏览 3,690

jvm垃圾回收

这篇讲的是JVM堆内存的“三代”划分如何影响垃圾回收策略。作者从JVM内存模型的基础概念出发,清晰梳理了堆空间的三大区域:存放新生对象的年轻代、保存生命周期较长对象的年老代,以及存储类元数据的永久代。文章特别指出,垃圾回收机制主要作用于前两代,永久代基本不参与,而各代因存储对象特性不同,会采用针对性的回收算法。 理解这个基础模型,是弄清各种垃圾回收器(如Serial、Parallel、CMS、G1)设计理念和适用场景的前提。文章虽然篇幅不长,但为后续深入探讨GC调优或排查内存问题提供了清晰的框架,适合需要系统化理解JVM内存管理的开发者阅读。

IT 累计浏览 2,114

JRockit读书笔记I ― Java代码的高效执行

这篇读书笔记基于《Oracle JRockit: The Definitive Guide》一书展开,作者是该JVM的两位核心开发人员,其中Marcus Hirt更是JRockit Mission Control的负责人,其技术权威性毋庸置疑。 文章没有停留在泛泛的读后感,而是聚焦于书中最具价值的部分:它系统性地剖析了一个JVM的典型实现架构,并重点拆解了JRockit为追求高性能所做的关键优化决策及其背后的技术权衡。对于想深入理解Java代码执行效率根源的读者,这提供了难得的内部视角。即便对JVM底层不感兴趣,其中蕴含的“如何通过分析瓶颈来针对性优化”的工程思维,也极具启发性。 作者坦言书中知识体量巨大,因此计划以系列博客的形式持续分享阅读所得。这篇作为开篇,主要梳理了阅读初衷与全书脉络,为后续深入探讨具体的优化技术细节拉开了序幕。

IT 累计浏览 3,299

Java运行时内存模型

这篇文章讲解了Java运行时内存模型的组成部分及其划分逻辑。作者根据《Java虚拟机规范》第二版,将运行时内存按生命周期划分为两类:一类是与整个JVM生命周期一致的内存区域,另一类是与线程生命周期一致的区域。具体而言,内存被分为PC计数器、栈、堆、方法区、运行时常量池和本地方法栈这六个部分。 其中,堆是存放对象实例的核心区域,垃圾收集主要发生在这里;方法区则用于存储已被虚拟机加载的类信息、常量、静态变量等数据。理解每个区域的职责和特点,对于分析应用内存占用、定位内存泄漏问题,或是进行针对性的性能调优,都提供了清晰的底层视角。