JVM生成的3种文件,你都见过吗?

什么是 Java 虚拟机(JVM)中的垃圾收集(GC)日志、线程转储和堆转储?

Java 虚拟机(JVM)生成3个关键文件,这些文件对于JVM优化性能和解决生产问题非常有用。这些文件是:

  • (GC) Garbage collection log 垃圾收集日志
  • Thread Dump 线程转储
  • Heap Dump 堆转储
带着问题一探究竟

在本文中,让我们尝试理解这三个关键文件,在哪里使用它们,它们看起来如何,如何捕获它们,如何分析它们和它们的差异是什么。

Garbage Collection Log (垃圾收集日志)

什么是 GC Log

GC 日志包含垃圾收集事件的相关信息。它将指示运行了多少 GC 事件、它们是什么类型的 GC 事件(即 Young GC 或 Full GC)、每个 GC 事件暂停应用程序的时间、每个 GC 事件回收了多少对象。

GC 日志长什么样?

可以在这里找到一个垃圾收集日志文件示例:

日志示例

分析GC 日志能查看出什么问题 ?

垃圾收集日志用于研究应用程序的 GC 和内存性能。它用于优化 GC 暂停时间,用于确定应用程序的最佳内存大小,还用于排除与内存相关的问题

如何生成 GC 日志?

您可以通过传递以下 JVM 参数来生成垃圾收集日志: 对于 Java8:

-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:<file-path>

从9开始的 Java 版本:

-Xlog:gc*:file=<file-path>

File-path: 是将要写入垃圾收集日志文件的位置。

如何理解 GC 日志?

垃圾收集日志的格式因 JVM 供应商的不同而不同(Oracle、 HP、 IBM、....,Java version (1.5,5,6,7,8,9,10,11,12,...) ,垃圾收集算法(Serial,Parallel,CMS,G1....和 JVM 各种参数。因此,没有一种可用的标准格式.不过这里有一个教程可以帮助你理解GC日志:link

用什么工具来分析 GC 日志?

有多个垃圾收集日志分析工具。这里给出一些流行的例子: GCeasy,IBM GC & Memory visualizer,HP JMeter,Google Garbage Cat。

线程转储(Thread dump)

什么是 Thread dump?

线程转储是应用程序中在某个时间点上运行的所有线程的快照。它包含应用程序中每个线程的所有信息,例如: 线程状态、线程 Id、本机 Id、线程名称、堆栈跟踪、优先级。

线程转储文件长什么样?

示例线程转储文件可以在这里找到:

文件示例

线程转储文件能解决什么问题?

线程转储文件主要用于排除生产问题,例如 CPU 峰值、应用程序中的无响应性、响应时间差、线程挂起、高内存消耗。

如何生成线程转储文件?

使用线程转储最常见的选择是使用“ jstack”工具。Jstack 工具是在 JDK_home\bin 文件夹中提供的。命令:

jstack -l <pid> > <file-path>

其中 pid: 是应用程序的进程 Id,应该捕获其线程转储,file-path: 是将线程转储写入的文件路径。

用什么工具来分析线程转储文件?

以下是使用最广泛的线程转储分析工具: fastThreadSamuraiIBM Thread & Monitor analyzerVisual VM

堆转储(Heap dump)

什么是堆转储?

堆转储是应用程序内存在某个时间点上的快照。它包含诸如内存中的对象是什么,它们携带什么值,它们的大小是什么,它们引用什么其他对象等信息。

堆转储看起来长什么样?

这里可以找到一个示例堆转储。示例文件

(注意: 它将是二进制格式的。所以你实际上不能阅读它)

分析堆转储能解决什么问题?

堆转储主要用于排除与内存有关的 OutOfMemoryError 问题

如何生成堆转储文件?

使用堆转储最常见的选择是使用“ jmap”工具。Jmap 工具是在 JDK_home\bin 文件夹中提供的

jmap -dump:format=b,file=<file-path>  [pid]
其中 pid: 是 Java 进程 Id ,file-path: 是将堆转储写入的文件路径。
如何分析和理解 Heap dump 用什么工具来分析 ??

堆转储文件采用二进制格式,并且大小往往很大。除此之外,他们的格式严重缺乏文档。因此,您必须使用堆转储分析工具,最广泛的堆转储分析工具有: Eclipse MAT、 HeapHero 和 JVisualVM。

关注公众号:java宝典 a

以下是将提供的内容转换为Markdown格式的文件: ```markdown # Hadoop-MapReduce 文档 ## 1. MapReduce 设计思想 ### 分而治之 - **对付大数据并行处理**:将大的数据切分成多个小数据,交给更多节点参与运算。 - 注意:不可拆分的计算任务或相互间有依赖关系的数据无法进行并行计算。 ### 抽象模型 - Input:读取数据。 - Split:对数据进行粗粒度切分。 - Map:对数据进行细粒度切分。 - Shuffle:洗牌,将各个 `MapTask` 结果合并输出到 `Reduce`。 - Reduce:对 `Shuffle` 进行汇总并输出到指定存储。 - Output:如 HDFS、Hive、Spark、Flume 等。 ### 统一架构 - 提供统一的计算框架,隐藏大多数系统层面处理细节,减轻程序员开发负担。 ### 特征 - **离线框架**:适合PB级别海量数据的离线处理。 - **不擅长实计算**:不适合毫秒或秒级返回结果。 - **不擅长流式计算**:输入数据是动态的,而 MapReduce 输入数据集是静态的。 - **不擅长 DAG(有向图)计算**:多应用程序存在依赖关系,性能低下。 ### 计算向数据靠拢 - 在数据节点上进行工作。 ### 顺序处理数据 - 规避随机访问数据,提升性能。 ### 失效被认为是常态 - 使用大量低端服务器,节点失效频繁。设计良好的并行计算系统应具备健壮性和容错性。 --- ## 2. 常用排序算法 ### 分类 #### 不值钱 - 学过计算机的基本都会的算法。 - 包括:冒泡排序、选择排序、插入排序。 #### 进阶型 - 更高效的算法。 - 包括:希尔排序(高级插入)、堆排序(高级选择)。 #### 常用型 - 实际应用广泛的算法。 - 包括:快速排序、归并排序。 #### 偏方型 - 在特定场景下有奇效。 - 包括:计数排序、桶排序、基数排序。 ### 快速排序 - **从冒泡排序演变而来**,实际上是递归分治法。 - **实现方式**:Hoare法(左右指针法)、前后指针法、挖坑法。 #### 左右指针法(Hoare法) - 第一个元素为 `Key`,`Begin` 和 `End` 分别指向第一个和最后一个元素。 - 操作直至 `Begin >= End`,交换 `Key` 和 `End` 的值,重复操作左右两边。 #### 挖坑法 - 挑选基准元素,所有小于基准值的元素置于左侧,大于的置于右侧。 - 示例:`arr = [5, 2, 4, 6, 1, 7, 8, 3]`,逐步调整,最终基准位于正确位置,再递归处理两侧子序列。 #### 前后指针法 - 初始设置 `Cur` 和 `Prev` 标志指针。 - `Cur` 前进,遇到小于基准值交换 `Prev` 和 `Cur` 的值,保证 `Cur` 与 `Prev` 间元素均大于基准值。 #### 优化选 Key - 最佳情况:每次选取中间值。 - 引入“三数取中”,取首中尾三个元素的中间值作为基准,解决有序数组排序效率低下的问题。 ### 归并排序 - **基于归并操作**的有效排序算法。 - **基本思想**:将原序列不断拆分至单个元素,再按插入方式归并。 - 间复杂度始终为 `O(n log n)`,但需要额外内存空间。 --- ## 3. MapReduce 计算流程 ### 计算1T数据中每个单词出现次数 -> wordcount #### 原始数据File - 数据被切分成块存放在 HDFS 上,每块 128M。 #### 数据块Block - 数据存储单元,同一文件中块大小相同。 - 可能块数量与集群计算能力不匹配,需动态调整参与计算的节点数量。 #### 切片Split - 控制参与计算的节点数目,切片大小为块的整数倍(2 或 1/2)。 - 默认情况下,切片大小等于块大小(默认 128M),一个切片对应一个 `MapTask`。 #### MapTask - 默认从所属切片读取数据,每次读取一行到内存。 - 计算每个单词出现次数,产生 `(Map<String, Integer>)` 临数据,存放在内存中。 - 为了避免 `OOM` 和低效率,数据会周期性写入硬盘。 #### 环形数据缓冲区 - 循环利用内存区域,减少数据溢写 `Map` 的停止间。 - 每个 `Map` 单独占用一块内存区域,默认大小为 100M。 - 当缓冲区达到 80% 开始溢写,留出 20% 空间,确保效率不减缓。 #### 分区 Partation - 根据 `Key` 计算对应的 `Reduce`。 - 分区数量与 `Reduce` 数量相等,默认分区算法为哈希取余。 #### 排序 Sort - 对溢写数据进行排序(`QuickSort`),按 `Partation` 和 `Key` 排序,确保相同分区和 `Key` 在一起。 #### 溢写 Spill - 将内存数据写入硬盘,避免 `OOM` 问题。 - 每次产生一个 80M 文件,数据较多可能多次溢写。 #### 合并 Merge - 将溢写产生的多个小文件合并成一个大文件,便于后续拉取数据。 - 合并过程中仍进行排序(归并排序),生成有序大文件。 #### 组合器 Combiner - 减少 `Map` 和 `Reduce` 间的数据传输。 - 自定义 `combiner` 函数,类似 `reduce` 函数,确保局部汇总结果不影响最终结果。 #### 拉取 Fetch - 将 `Map` 的临结果拉取到 `Reduce` 节点。 - 确保相同 `Key` 拉取到同一个 `Reduce` 节点。 #### 归并 Reduce - 读取文件数据到内存,将相同 `Key` 全部读取并得出最终结果。 #### 写出 Output - 每个 `Reduce` 将最终结果存放到 HDFS 上。 --- ## 4. Hadoop-YARN 架构 ### 基本概念 - **Yarn**:另一种资源协调者,用于统一管理资源。 - **ResourceManager**:资源协调框架的管理者,分为主节点和备用节点。 - **NodeManager**:资源协调框架的执行者,每个 `DataNode` 上默认有一个 `NodeManager`。 - **ApplicationMaster**:负责调度被分配的资源 `Container`,任务完成后通知 `ResourceManager` 销毁资源。 - **Task**:开始按照 `MR` 流程执行业务。 ### 工作流程 - 根据 `mapreduce.framework.name` 变量配置选择运行框架。 - `Client` 发起提交作业申请,`ResouceManager` 返回 `JobID` 并保存数据资源。 - `Client` 计算分片并将资源拷贝到 HDFS,最后提交 `Job` 给 `ResouceManager`。 - `ApplicationManager` 接收提交的 `Job` 并交由 `ResourceScheduler` 处理。 - `ApplicationMaster` 注册并与 `ResourceManager` 交互,申请资源并调度任务。 --- ## 5. Hadoop-YARN 环境搭建 ### 目标环境 - 基于 HA 环境搭建。 ### 修改配置文件 - 修改 `hadoop-env.sh`、`mapred-site.xml` 和 `yarn-site.xml` 文件。 - 添加必要的环境变量和配置项。 ### 拷贝至其他节点 - 将配置好的 YARN 拷贝至其他节点。 ### 启动 - 启动 ZooKeeper、HDFS 和 YARN。 - 启动 JobHistory。 ### 关闭 - 关闭 Hadoop 和 JobHistory,再关闭 ZooKeeper。 --- ## 6. MapReduce 案例 - WordCount ### Java代码实现 - 主要涉及 `WordCountJob` 类、`WordCountMapper` 类和 `WordCountReducer` 类。 - 设置 `Map` 输出的 `Key` 和 `Value` 类型,配置 `Map` 和 `Reduce` 的处理类。 ### 提交方式 - Linux端:`hadoop jar wordcount.jar com.yjxxt.mapred.wordcount.WordCountJob` ### YARN常用命令 - 查看节点:`yarn node-list-all` - 查看所有 Application:`yarn application-list` - 杀死 Application:`yarn application-kill <application_id>` - 查看 Application 日志:`yarn logs -applicationId <application_id>` --- ## 7. MapReduce 案例 - 充值记录 ### Mock数据 - 自动生成一万条充值记录,模拟用户行为。 - 按照性别分类统计男女性用户的充值总额。 --- ## 8. MapReduce 案例 - 天气信息 ### 需求 - 每个地区的每日最高温及最低温。 - 每月温度最高的三天。 --- ## 9. MapReduce 案例 - 好友推荐 ### 需求 - 根据互为好友的关系,进行好友推荐。 --- ## 10. MapReduce 压缩 ### 概述 - 压缩技术能减少存储读写字节数,提高网络带宽和磁盘空间效率。 - 压缩在大数据环境中尤为重要,特别是在 I/O 密集型作业中。 ### 压缩实践 - 支持的压缩格式及其特点见表格。 - 压缩应用场景的选择依据。 --- ## 11. MapReduce 源码分析 ### Split - 创建切片文件,设置切片数量。 ### MapTask - 初始化 `MapTask`,读取输入并执行 `Mapper` 方法。 ### KvBuffer - 初始化环形缓冲区,设置溢写阈值。 ### Spill - 将缓冲区数据溢写到磁盘。 ### Merge - 合并溢写文件,减少磁盘 I/O 次数。 ### ReduceTask - 获取 `Key` 和 `Value` 的迭代器,执行 `Reducer` 方法。 --- ## 12. MapReduce 优化 ### 概述 - 明确 Hadoop 的优势和适用场景,了解 MapReduce 执行流程。 ### 小文件优化 - 使用 `CombineFileInputFormat` 读取数据合并小文件。 ### 数据倾斜 - 解决方法包括自定义分区、增加 Reduce 的资源或调整 Reduce 数量。 ### 推测执行 - 开启推测执行,空间换间,提高作业性能。 ### MapReduce 执行流程优化 - **Map** - **临文件**:合理设置文件副本数量。 - **分片**:调整分片大小以动态设置 Map 数量。 - **资源**:根据业务需求调整 Map 的资源。 - **环形缓冲区 & 溢写**:调整缓冲区大小和溢写百分比。 - **合并**:增加合并因子,减少合并次数。 - **输出**:使用组合器和压缩减少数据传输。 - **Reduce** - **资源**:合理设置 Reduce 数量和资源。 - **拉取**:调整拉取并行度和超间。 - **缓冲区 & 溢写**:基于 JVM Heap Size 设置缓冲区大小。 - **合并**:增加合并因子,减少磁盘操作。 - **读缓存**:启用读缓存以减少磁盘 I/O。 --- ``` 此 Markdown 文件包含了原文档的主要内容,并遵循 Markdown 语法进行了适当的格式化,使其更易于阅读和理解。希望这对您有所帮助!如果您有任何进一步的需求,请告知我。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值