展开全部

主编推荐语

本书详细介绍Java虚拟机配置、故障排查与性能优化,涵盖Java 6-10,实用案例丰富,助力研发人员攻破JVM瓶颈。

内容简介

不管技术如何发展,Java依然是一个充满活力的生态圈,学习Java的人也越来越多,但多数人学习Java虚拟机(JVM)时都会遇到瓶颈。本书将通过200余示例详细介绍JVM中的各种参数配置、故障排查、性能监控及性能优化,帮助Java人突破瓶颈。本书共11章,修订后版本涵盖Java 6~Java 10。第1~3章介绍了Java虚拟机的定义、总体架构、常用配置参数。第4~5章介绍了垃圾回收的算法和各种垃圾回收器。第6章介绍了Java虚拟机的性能监控和故障诊断工具。第7章详细介绍了对Java堆的分析方法和案例。第8章介绍了Java虚拟机对多线程,尤其是对锁的支持。第9~10章介绍了Java虚拟机的核心——Class文件结构,以及Java虚拟机中类的装载系统。第11章介绍了Java虚拟机的执行系统和字节码,并给出了通过ASM框架进行字节码注入的案例。本书不仅适合Java程序员,还适合任何一名工作于Java虚拟机之上的研发人员、软件设计师、架构师。未经许可,

目录

  • 版权信息
  • 内容简介
  • 前言
  • 关于Java生态圈
  • 第2版的重点修订
  • 本书的体系结构
  • 本书特色
  • 适合阅读人群
  • 本书的约定
  • 联系作者
  • 感谢
  • 读者服务
  • 第1章 初探Java虚拟机
  • 1.1 知根知底:追溯Java的发展历程
  • 1.1.1 那些依托Java虚拟机的语言大咖们
  • 1.1.2 Java发展史上的里程碑
  • 1.2 跨平台的真相:Java虚拟机做中介
  • 1.2.1 理解Java虚拟机的原理
  • 1.2.2 看清Java虚拟机的种类
  • 1.3 一切看我的:Java语言规范
  • 1.3.1 词法的定义
  • 1.3.2 语法的定义
  • 1.3.3 数据类型的定义
  • 1.3.4 Java语言规范总结
  • 1.4 一切听我的:Java虚拟机规范
  • 1.5 数字编码就是计算机世界的水和电
  • 1.5.1 整数在Java虚拟机中的表示
  • 1.5.2 浮点数在Java虚拟机中的表示
  • 1.6 抛砖引玉:编译和调试虚拟机
  • 1.7 小结
  • 第2章 认识Java虚拟机的基本结构
  • 2.1 谋全局者才能成大器:看穿Java虚拟机的架构
  • 2.2 小参数能解决大问题:学会设置Java虚拟机的参数
  • 2.3 对象去哪儿:辨清Java堆
  • 2.4 函数如何调用:出入Java栈
  • 2.4.1 局部变量表
  • 2.4.2 操作数栈
  • 2.4.3 帧数据区
  • 2.4.4 栈上分配
  • 2.5 类去哪儿了:识别方法区
  • 2.6 小结
  • 第3章 常用Java虚拟机参数
  • 3.1 一切运行都有迹可循:掌握跟踪调试参数
  • 3.1.1 跟踪垃圾回收—读懂虚拟机日志
  • 3.1.2 类加载/卸载的跟踪
  • 3.1.3 查看系统参数
  • 3.2 让性能飞起来:学习堆的配置参数
  • 3.2.1 最大堆和初始堆的设置
  • 3.2.2 新生代的配置
  • 3.2.3 堆溢出处理
  • 3.3 别让性能有缺口:了解非堆内存的参数配置
  • 3.3.1 方法区配置
  • 3.3.2 栈配置
  • 3.3.3 直接内存配置
  • 3.4 Client和Server二选一:虚拟机的工作模式
  • 3.5 小结
  • 第4章 垃圾回收的概念与算法
  • 4.1 内存管理清洁工:认识垃圾回收
  • 4.2 清洁工具大PK:讨论常用的垃圾回收算法
  • 4.2.1 引用计数法(Reference Counting)
  • 4.2.2 标记清除法(Mark-Sweep)
  • 4.2.3 复制算法(Copying)
  • 4.2.4 标记压缩法(Mark-Compact)
  • 4.2.5 分代算法(Generational Collecting)
  • 4.2.6 分区算法(Region)
  • 4.3 谁才是真正的垃圾:判断可触及性
  • 4.3.1 对象的复活
  • 4.3.2 引用和可触及性的强度
  • 4.3.3 软引用—可被回收的引用
  • 4.3.4 弱引用—发现即回收
  • 4.3.5 虚引用—对象回收跟踪
  • 4.4 垃圾回收时的停顿现象:Stop-The-World案例实战
  • 4.5 小结
  • 第5章 垃圾收集器和内存分配
  • 5.1 一心一意一件事:串行回收器
  • 5.1.1 新生代串行回收器
  • 5.1.2 老年代串行回收器
  • 5.2 人多力量大:并行回收器
  • 5.2.1 新生代ParNew回收器
  • 5.2.2 新生代ParallelGC回收器
  • 5.2.3 老年代ParallelOldGC回收器
  • 5.3 一心多用都不落下:CMS回收器(JDK 8及之前的版本)
  • 5.3.1 CMS主要工作步骤
  • 5.3.2 CMS主要的参数
  • 5.3.3 CMS的日志分析
  • 5.3.4 有关Class的回收
  • 5.4 未来我做主:G1回收器(JDK 9及之后版本的默认回收器)
  • 5.4.1 G1的内存划分和主要收集过程
  • 5.4.2 G1的新生代GC
  • 5.4.3 G1的并发标记周期
  • 5.4.4 混合回收
  • 5.4.5 必要时的Full GC
  • 5.4.6 G1的日志
  • 5.4.7 G1相关的参数
  • 5.5 回眸:有关对象内存分配和回收的一些细节问题
  • 5.5.1 禁用System.gc()
  • 5.5.2 System.gc()使用并发回收
  • 5.5.3 并行GC前额外触发的新生代GC
  • 5.5.4 对象何时进入老年代
  • 5.5.5 在TLAB上分配对象
  • 5.5.6 finalize()函数对垃圾回收的影响
  • 5.6 温故又知新:常用的GC参数
  • 5.7 动手才是真英雄:垃圾回收器对Tomcat性能影响的实验
  • 5.7.1 配置实验环境
  • 5.7.2 配置性能测试工具JMeter
  • 5.7.3 配置Web应用服务器Tomcat
  • 5.7.4 实战案例1—初试串行回收器
  • 5.7.5 实战案例2—扩大堆以提升系统性能
  • 5.7.6 实战案例3—调整初始堆大小
  • 5.7.7 实战案例4—使用ParrellOldGC回收器
  • 5.7.8 实战案例5—使用较小堆提高GC压力
  • 5.7.9 实战案例6—测试ParallelOldGC的表现
  • 5.7.10 实战案例7—测试ParNew回收器的表现
  • 5.7.11 实战案例8—测试JDK 1.8的表现
  • 5.7.12 实战案例9—使用高版本虚拟机提升性能
  • 5.8 小结
  • 第6章 性能监控工具
  • 6.1 有我更高效:Linux下的性能监控工具
  • 6.1.1 显示系统整体资源使用情况—top命令
  • 6.1.2 监控内存和CPU—vmstat命令
  • 6.1.3 监控I/O—iostat命令
  • 6.1.4 多功能诊断器—pidstat工具
  • 6.2 用我更高效:Windows下的性能监控工具
  • 6.2.1 任务管理器
  • 6.2.2 perfmon性能监控工具
  • 6.2.3 Process Explorer进程管理工具
  • 6.2.4 pslist命令—Windows下也有命令行工具
  • 6.3 外科手术刀:JDK性能监控工具
  • 6.3.1 查看Java进程—jps命令
  • 6.3.2 查看虚拟机运行时信息—jstat命令
  • 6.3.3 查看虚拟机参数—jinfo命令
  • 6.3.4 导出堆到文件—jmap命令
  • 6.3.5 JDK自带的堆分析工具—jhat命令
  • 6.3.6 查看线程堆栈—jstack命令
  • 6.3.7 远程主机信息收集—jstatd命令
  • 6.3.8 多功能命令行—jcmd命令
  • 6.3.9 性能统计工具—hprof
  • 6.3.10 扩展jps命令
  • 6.4 我是你的眼:图形化虚拟机监控工具JConsole
  • 6.4.1 JConsole连接Java程序
  • 6.4.2 Java程序概况
  • 6.4.3 内存监控
  • 6.4.4 线程监控
  • 6.4.5 类加载情况
  • 6.4.6 虚拟机信息
  • 6.5 一目了然:可视化性能监控工具Visual VM
  • 6.5.1 Visual VM连接应用程序
  • 6.5.2 监控应用程序概况
  • 6.5.3 Thread Dump和分析
  • 6.5.4 性能分析
  • 6.5.5 内存快照分析
  • 6.5.6 BTrace介绍
  • 6.6 来自JRockit的礼物:虚拟机诊断工具Mission Control
  • 6.6.1 MBean服务器
  • 6.6.2 飞行记录器(Flight Recorder)
  • 6.7 小结
  • 第7章 分析Java堆
  • 7.1 对症才能下药:找到内存溢出的原因
  • 7.1.1 堆溢出
  • 7.1.2 直接内存溢出
  • 7.1.3 过多线程导致OOM
  • 7.1.4 永久区溢出
  • 7.1.5 GC效率低下引起的OOM
  • 7.2 无处不在的字符串:String在虚拟机中的实现
  • 7.2.1 String对象的特点
  • 7.2.2 有关String的内存泄漏
  • 7.2.3 有关String常量池的位置
  • 7.3 虚拟机也有内窥镜:使用MAT分析Java堆
  • 7.3.1 初识MAT
  • 7.3.2 浅堆和深堆
  • 7.3.3 MAT堆分析案例解析
  • 7.3.4 支配树(Dominator Tree)
  • 7.3.5 Tomcat堆溢出分析
  • 7.4 筛选堆对象:MAT对OQL的支持
  • 7.4.1 Select子句
  • 7.4.2 From子句
  • 7.4.3 Where子句
  • 7.4.4 内置对象与方法
  • 7.5 更精彩的查找:Visual VM对OQL的支持
  • 7.5.1 Visual VM的OQL基本语法
  • 7.5.2 内置heap对象
  • 7.5.3 对象函数
  • 7.5.4 集合/统计函数
  • 7.5.5 程序化OQL分析Tomcat堆
  • 7.6 小结
  • 第8章 锁与并发
  • 8.1 安全就是锁存在的理由:锁的基本概念和实现
  • 8.1.1 理解线程安全
  • 8.1.2 对象头和锁
  • 8.2 避免残酷的竞争:锁在Java虚拟机中的实现和优化
  • 8.2.1 偏向锁
  • 8.2.2 轻量级锁
  • 8.2.3 锁膨胀
  • 8.2.4 自旋锁
  • 8.2.5 锁消除
  • 8.3 应对残酷的竞争:锁在应用层的优化思路
  • 8.3.1 减少锁持有时间
  • 8.3.2 减小锁粒度
  • 8.3.3 锁分离
  • 8.3.4 锁粗化
  • 8.4 无招胜有招:无锁
  • 8.4.1 理解CAS
  • 8.4.2 原子操作
  • 8.4.3 新宠儿LongAdder
  • 8.5 将随机变为可控:理解Java内存模型
  • 8.5.1 原子性
  • 8.5.2 有序性
  • 8.5.3 可见性
  • 8.5.4 Happens-Before原则
  • 8.6 小结
  • 第9章 Class文件结构
  • 9.1 不仅跨平台,还能跨语言:语言无关性
  • 9.2 虚拟机的基石:Class文件
  • 9.2.1 Class文件的标志—魔数
  • 9.2.2 Class文件的版本
  • 9.2.3 存放所有常数—常量池
  • 9.2.4 Class的访问标记(Access Flag)
  • 9.2.5 当前类、父类和接口
  • 9.2.6 Class文件的字段
  • 9.2.7 Class文件的方法基本结构
  • 9.2.8 方法的执行主体—Code属性
  • 9.2.9 记录行号—LineNumberTable属性
  • 9.2.10 保存局部变量和参数—LocalVariableTable属性
  • 9.2.11 加快字节码校验—StackMapTable属性
  • 9.2.12 Code属性总结
  • 9.2.13 抛出异常—Exceptions属性
  • 9.2.14 用实例分析Class的方法结构
  • 9.2.15 我来自哪里—SourceFile属性
  • 9.2.16 强大的动态调用—BootstrapMethods属性
  • 9.2.17 内部类—InnerClasses属性
  • 9.2.18 将要废弃的通知—Deprecated属性
  • 9.2.19 Class文件总结
  • 9.3 操作字节码:走进ASM
  • 9.3.1 ASM体系结构
  • 9.3.2 ASM之Hello World
  • 9.4 小结
  • 第10章 Class装载系统
  • 10.1 来去都有序:看懂Class文件的装载流程
  • 10.1.1 类装载的条件
  • 10.1.2 加载类
  • 10.1.3 验证类
  • 10.1.4 准备
  • 10.1.5 解析类
  • 10.1.6 初始化
  • 10.2 一切Class从这里开始:掌握ClassLoader
  • 10.2.1 认识ClassLoader,看懂类加载
  • 10.2.2 ClassLoader的分类
  • 10.2.3 ClassLoader的双亲委托模式
  • 10.2.4 双亲委托模式的弊端
  • 10.2.5 双亲委托模式的补充
  • 10.2.6 突破双亲模式
  • 10.2.7 热替换的实现
  • 10.3 小结
  • 第11章 字节码执行
  • 11.1 代码如何执行:字节码执行案例
  • 11.2 执行的基础:Java虚拟机常用指令介绍
  • 11.2.1 常量入栈指令
  • 11.2.2 局部变量压栈指令
  • 11.2.3 出栈装入局部变量表指令
  • 11.2.4 通用型操作
  • 11.2.5 类型转换指令
  • 11.2.6 运算指令
  • 11.2.7 对象操作指令
  • 11.2.8 比较控制指令
  • 11.2.9 函数调用与返回指令
  • 11.2.10 同步控制
  • 11.2.11 再看Class的方法结构
  • 11.3 更上一层楼:再看ASM
  • 11.3.1 为类增加安全控制
  • 11.4 谁说Java太刻板:Java Agent运行时修改类
  • 11.4.1 使用-javaagent参数启动Java虚拟机
  • 11.4.2 使用Java Agent为函数增加计时功能
  • 11.4.3 动态重转换类
  • 11.4.4 有关Java Agent的总结
  • 11.5 与时俱进:动态方法调用
  • 11.5.1 方法句柄使用实例
  • 11.5.2 调用点使用实例
  • 11.5.3 反射和方法句柄
  • 11.5.4 指令invokedynamic使用实例
  • 11.6 跑得再快点:静态编译优化
  • 11.6.1 编译时计算
  • 11.6.2 变量字符串的连接
  • 11.6.3 基于常量的条件语句裁剪
  • 11.6.4 switch语句的优化
  • 11.7 提高虚拟机的执行效率:JIT及其相关参数
  • 11.7.1 开启JIT编译
  • 11.7.2 JIT编译阈值
  • 11.7.3 多级编译器
  • 11.7.4 OSR栈上替换
  • 11.7.5 方法内联
  • 11.7.6 设置代码缓存大小
  • 11.8 小结
展开全部

评分及书评

尚无评分
目前还没人评分

出版方

电子工业出版社

电子工业出版社成立于1982年10月,是国务院独资、工信部直属的中央级科技与教育出版社,是专业的信息技术知识集成和服务提供商。经过三十多年的建设与发展,已成为一家以科技和教育出版、期刊、网络、行业支撑服务、数字出版、软件研发、软科学研究、职业培训和教育为核心业务的现代知识服务集团。出版物内容涵盖了电子信息技术的各个分支及工业技术、经济管理、科普与少儿、社科人文等领域,综合出版能力位居全国出版行业前列。