作 者:葛一鸣,郭超 编著 定 价:69 出 版 社:电子工业出版社 出版日期:2015年11月01日 页 数:339 装 帧:平装 ISBN:9787121273049 ●第1章 走入并行世界1
●1.1 何去何从的并行计算 1
●1.1.1 忘掉那该死的并行 2
●1.1.2 可怕的现实:摩尔定律的失效 4
●1.1.3 柳暗花明:不断地前进 5
●1.1.4 光明或是黑暗 6
●1.2 你必须知道的几个概念 6
●1.2.1 同步(Synchronous)和异步(Asynchronous) 7
●1.2.2 并发(Concurrency)和并行(Parallelism) 8
●1.2.3 临界区 9
●1.2.4 阻塞(Blocking)和非阻塞(Non-Blocking) 9
●1.2.5 死锁(Deadlock)、饥饿(Starvation)和活锁(Livelock) 9
●1.3 并发级别 11
●1.3.1 阻塞(Blocking) 11
●1.3.2 无饥饿(Starvation-Free) 11
●1.3.3 无障碍(Obstruction-Free) 12
●1.3.4 无锁(Lock-Free) 12
●1.3.5 无等待(Wait-Free) 13
●1.4 有关并行的两个重要定律 13
●1.4.1 Amdahl定律 13
●部分目录
内容简介
在过去单核CPU时代,单任务在一个时间点只能执行单一程序,随着多核CPU的发展,并行程序开发就显得尤为重要。
本书主要介绍基于Java的并行程序设计基础、思路、方法和实战。靠前,立足于并发程序基础,详细介绍Java中进行并行程序设计的基本方法。第二,进一步详细介绍JDK中对并行程序的强大支持,帮助读者快速、稳健地进行并行程序开发。第三,详细讨论有关“锁”的优化和提高并行程序性能级别的方法和思路。第四,介绍并行的基本设计模式及Java 8对并行程序的支持和改进。第五,介绍高并发框架Akka的使用方法。很后,详细介绍并行程序的调试方法。 葛一鸣,郭超 编著 葛一鸣,51CTO特约讲师,国家认证系统分析师,获得Oracle OCP认证。长期从事、Java软件开发工作,对Java程序设计、JVM有深入的研究,对设计模式、人工智能、神经网络、数据挖掘等技术有浓厚兴趣,著有《自己动手写神经网路》电子书,也开设了在线的《深入浅出Java虚拟机――入门篇》培训课程。
郭超,就职于杭州市道路运输管理局信息中心,主要从事大型交通管理系统的分布式管理和并发模型设计,对Java的研究比较深入,专注于分布式应用和并发应用。
深入探索JVM:性能调优、内存管理与垃圾回收机制 本书将带你踏上一段深入JVM(Java Virtual Machine)核心的旅程,旨在帮助开发者构建更高效、更稳定的Java应用程序。我们不再局限于Java语言本身的语法和API,而是将目光聚焦于Java程序赖以运行的底层环境——JVM。通过系统性地剖析JVM的各个关键组件和工作原理,你将能够深刻理解Java程序的执行流程,掌握性能瓶颈的定位与优化技巧,以及如何有效地管理内存、规避内存泄漏,并深入理解垃圾回收(GC)的内在机制。 一、 JVM内存模型与布局:理解程序运行的基石 理解JVM内存模型是进行性能优化的首要步骤。本书将详细讲解JVM内存区域的划分,包括: 堆(Heap): Java对象实例的存储区域,是GC的主要战场。我们将深入分析堆的年轻代(Young Generation)和老年代(Old Generation)的划分,以及它们各自的垃圾回收算法(如Serial、ParNew、Parallel Scavenge等)和对象晋升(Promotion)的机制。你将了解到对象在堆中的生命周期,以及如何通过理解这一过程来优化内存分配和减少GC压力。 栈(Stack): 方法调用、局部变量、操作数栈的存储区域。我们将区分Java栈(JVM Stack)和本地方法栈(Native Method Stack),并详细阐述栈帧(Stack Frame)的结构和方法调用的过程。这将帮助你理解StackOverflowError等异常的根源,并掌握分析方法调用深度的技巧。 方法区(Metaspace / Permanent Generation): 类信息、常量、静态变量等的存储区域。我们将重点讲解HotSpot JVM中元空间(Metaspace)的演进,以及永久代(PermGen)在Java 8中的移除。理解这部分内存的增长和清理机制,对于避免OutOfMemoryError(Java Heap Space / Metaspace)至关重要。 程序计数器(Program Counter Register): 记录当前执行指令的地址。虽然占用的空间很小,但对于理解线程的执行流程至关重要。 直接内存(Direct Memory): JVM堆外内存,常用于NIO(Non-blocking I/O)等场景。我们将探讨直接内存的分配与管理,以及它与堆内存的关系,帮助你理解和规避与直接内存相关的性能问题。 二、 类加载机制:洞悉Java程序的“生命周期” Java程序的运行始于类加载。本书将系统性地解析Java类加载的整个过程,包括: 加载(Loading): 查找并导入类文件,将类的二进制数据读入内存。我们将深入了解类加载器的作用,包括根类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(Application ClassLoader),以及它们之间的委托机制(Delegation Model)。 验证(Verification): 检查类文件的结构和安全性,防止恶意代码的注入。你将了解到字节码校验(Bytecode Verifier)在保障JVM安全运行中的关键作用。 准备(Preparation): 为类的静态变量分配内存,并用默认值初始化。 解析(Resolution): 将类中的符号引用(Symbolic References)转换为直接引用(Direct References)。 初始化(Initialization): 执行类构造器 `(...)` 方法,为类的静态变量赋予初始值。我们将详细讲解类的初始化时机,以及静态代码块的执行顺序。 理解类加载机制,能够帮助我们解决类加载缓慢、重复加载等问题,并为动态加载类、代码隔离等高级场景奠定基础。 三、 字节码工程:代码的“内在语言” Java源代码最终被编译成字节码,在JVM上执行。本书将带你窥探字节码的奥秘,让你理解: 字节码指令集: 各种指令的含义和作用,例如加载、存储、运算、跳转等。 Javac编译器的行为: 源代码如何被翻译成字节码。 字节码的读写与分析: 了解如何使用ASM、Byte Buddy等字节码操作框架,实现代码的动态生成、修改和增强。这将为 Aspect-Oriented Programming(AOP)、动态代理、代码插桩等高级技术提供理论支持。 四、 垃圾回收(GC)深度解析:让内存管理自动化 垃圾回收是Java内存管理的核心。本书将对各种垃圾回收算法进行深入剖析,并提供实践指导: GC的基本原理: 引用计数(Reference Counting)和根可达性分析(Reachability Analysis)两种主要方式。 分代回收理论: 年轻代和老年代的回收特点及演进。 新生代GC算法: Serial GC: 最简单的单线程GC,适用于单CPU环境。 ParNew GC: Serial GC的多线程版本,适用于多CPU环境。 Parallel Scavenge GC: 关注吞吐量,适用于需要高吞吐量的服务器应用。 老年代GC算法: Serial Old GC: Serial GC的单线程老年代版本。 Parallel Old GC: Parallel Scavenge GC的老年代版本,同样关注吞吐量。 CMS (Concurrent Mark Sweep) GC: 追求低延迟,通过与用户线程并发执行来减少STW(Stop-The-World)停顿时间,并分析其缺点(如内存碎片)。 G1 (Garbage-First) GC: JDK 9的默认GC,是一款面向服务器的、兼顾吞吐量和低延迟的GC。我们将详细讲解其Region划分、Mixed GC、Humongous Regions等概念。 ZGC (Z Garbage Collector): 专为大规模堆设计,具有极低的停顿时间(亚毫秒级别)。 Shenandoah GC: 另一个低停顿GC,与ZGC类似。 GC日志分析: 如何解读GC日志,定位GC的瓶颈,并根据日志信息选择合适的GC算法和参数。 内存泄漏的诊断与规避: 通过MAT(Memory Analyzer Tool)、VisualVM等工具,结合GC原理,找出程序中的内存泄漏源头。 五、 JVM性能调优实战:让你的程序飞起来 掌握了JVM的内存模型、类加载和GC机制后,我们将进入性能调优的实战环节: JVM启动参数详解: 介绍常用JVM参数,如堆大小设置(`-Xms`, `-Xmx`)、GC算法选择、线程栈大小等,并解释它们对性能的影响。 性能瓶颈的定位: CPU分析: 使用JProfiler、YourKit等性能剖析工具,找出CPU占用过高的代码段。 内存分析: 结合GC日志和堆转储(Heap Dump)分析,定位内存占用过高或内存泄漏的问题。 线程分析: 分析线程状态、死锁等问题,使用Thread Dump辅助诊断。 代码层面的优化: 结合JVM原理,提出针对性的代码优化建议,例如: 优化对象创建和销毁。 减少不必要的对象引用,帮助GC。 合理使用集合类,避免内存溢出。 使用StringBuilder代替String拼接。 理解finalizer的坑,慎用。 并发编程与JVM: 探讨Java并发环境下,JVM内存模型(JMM)对线程安全的影响,以及如何通过`volatile`、`synchronized`、CAS等机制来保证线程安全。 六、 JVM监控与诊断工具:掌握你的程序健康状况 本书将介绍一系列强大的JVM监控和诊断工具,帮助你全面了解程序的运行状态: JPS: 列出JVM进程ID。 JCMD: 强大的JVM诊断命令集,可以获取系统信息、GC统计、线程信息等。 JSTAT: 监控JVM统计信息,如GC、类加载、编译等。 JMAP: 生成堆转储文件,用于内存分析。 JSTACK: 生成线程快照,用于线程分析。 VisualVM: 集成多种监控和诊断功能,用户界面友好。 MAT (Memory Analyzer Tool): 专业的内存分析工具,用于查找内存泄漏。 Arthas: 阿里巴巴开源的Java诊断工具,功能强大,支持热部署、诊断、监控等。 目标读者: 希望深入理解Java程序运行原理的Java开发者。 面临Java应用程序性能问题,需要进行性能调优的工程师。 对JVM内部机制感兴趣,希望提升自身技术深度的开发者。 从事Java后端开发,需要处理高并发、大数据量场景的工程师。 通过阅读本书,你将不再满足于仅仅调用Java API,而是能够从JVM的视角审视你的代码,理解“为什么”和“怎么样”运行,最终成为一名能够构建高性能、高可用Java应用的资深开发者。
这本书简直是我的高并发编程救星!读完它,感觉整个世界的并发都变得清晰了。之前写并发程序,总觉得像是在黑暗中摸索,各种锁、线程池、可见性、原子性这些概念就像一团乱麻,用起来总是提心吊胆,生怕哪里出了问题导致死锁或者数据不一致。而这本书,用非常生动形象的比喻和深入浅出的讲解,把这些复杂的概念一一剖析开来。尤其是讲到 CAS (Compare-And-Swap) 的时候,作者用了一个非常贴切的生活场景来类比,我一下子就明白了它的原理和应用。还有关于并发三大特性(原子性、可见性、有序性)的阐述,更是细致入微,配合代码示例,让我不再是死记硬背,而是真正理解了它们为什么会发生,以及如何去规避。这本书的优点在于,它不仅仅是理论的堆砌,而是将理论与实践紧密结合,每一章都配有大量的实际案例,让我能够边学边练,快速掌握知识点。比如,在介绍 `synchronized` 关键字的时候,作者并没有止步于它的基本用法,而是深入讲解了它的底层实现原理,包括偏向锁、轻量级锁、重量级锁的演进过程,以及锁升级的条件。这让我对 `synchronized` 的理解提升了一个层次,也让我知道在什么场景下使用它最合适,什么时候可以考虑其他更优的并发控制方案。书中的代码示例也非常规范,可读性强,可以直接复制到本地运行,验证学习效果。