Kafka 可观测性最佳实践

Kafka 概述

Kafka 是由 LinkedIn 开发一个分布式的基于发布订阅模式的消息队列,是一个实时数据处理系统,可以横向扩展。与 RabbitMQ、RockerMQ 等中间件一样拥有几大特点:

  • 异步处理
  • 服务解耦
  • 流量削峰

监控 Kafka 是非常重要的,因为它可以帮助我们确保消息系统的稳定性、可用性、性能和可靠性。以下是监控 Kafka 的一些关键原因:

  1. 保证消息传递的可靠性:Kafka 作为一个分布式流处理平台,其核心价值在于可靠地存储和传递消息。监控可以帮助我们及时发现和解决数据丢失或重复的问题。
  2. 维护服务的高可用性:Kafka 通过副本机制来实现高可用性。监控副本同步状态和领导者选举,可以确保在节点故障时,相关的分区能够快速进行领导者选举,最小化服务中断。
  3. 优化性能:通过监控 Kafka 的性能指标,比如吞吐量、延迟和磁盘I/O,我们可以对 Kafka 集群进行调优,确保它在高负载下依然能够保持高性能。
  4. 容量规划:监控可以帮助我们理解数据增长的趋势,预测未来的存储需求,从而进行合理的容量规划,避免存储空间不足的情况发生。
  5. 故障排除:当系统出现问题时,监控系统提供的历史数据和实时数据对于快速定位问题原因非常关键。
  6. 遵守 SLA:对于需要遵守服务等级协议(SLA)的生产系统,监控可以帮助我们确保 Kafka 服务满足这些协议的要求。
  7. 安全审计:监控还可以涉及到安全层面,比如监控未授权访问的尝试,确保系统的安全性。
  8. 业务洞察:通过对消息内容的监控和分析,可以为业务决策提供数据支持,比如通过分析消息流量来优化业务流程。

观测云采集器 DataKit 提供 kafka 指标和日志的观测能力,配置 DataKit 采集 Kafka 指标和日志上报到观测云,帮助你监控分析 Kafka 性能表现以及各种异常情况。

操作步骤

前置条件

安装或下载 Jolokia 。DataKit 安装目录下的 data 目录中已经有下载好的 Jolokia jar 包,可先下载安装 DataKit 。

Jolokia 是作为 Kafka 的 Java agent,基于 HTTP 协议提供了一个使用 JSON 作为数据格式的外部接口,提供给 DataKit 使用。 Kafka 启动时,先配置 KAFKA_OPTS 环境变量:(port 可根据实际情况修改成可用端口)

export KAFKA_OPTS="$KAFKA_OPTS -javaagent:/usr/local/datakit/data/jolokia-jvm-agent.jar=host=*,port=8080"

另外,也可以单独启动 Jolokia,将其指向 Kafka 进程 PID:

java -jar </path/to/jolokia-jvm-agent.jar> --host 127.0.0.1 --port=8080 start <Kafka-PID>

采集器配置

进入 DataKit 安装目录下的 conf.d/db 目录,复制 kafka.conf.sample 并命名为 kafka.conf 。

指标采集(主机模式)
[[inputs.kafka]]# default_tag_prefix      = ""# default_field_prefix    = ""# default_field_separator = "."# username = ""# password = ""# response_timeout = "5s"## Optional TLS config# tls_ca   = "/var/private/ca.pem"# tls_cert = "/var/private/client.pem"# tls_key  = "/var/private/client-key.pem"# insecure_skip_verify = false## Monitor Interval# interval   = "60s"# Add agents URLs to queryurls = ["http://localhost:8080/jolokia"]......

主要是调整 urls ,配置好后,重启 DataKit 即可。

日志采集

采集 Kafka 的日志,可在 kafka.conf 中 将 files 打开,并写入 kafka 日志文件的绝对路径。比如:

[[inputs.kafka]]...[inputs.kafka.log]files = ["/usr/local/var/log/kafka/error.log","/usr/local/var/log/kafka/kafka.log"]

开启日志采集以后,默认会产生日志来源(source)为 kafka 的日志,切割日志示例:

[2020-07-07 15:04:29,333] DEBUG Progress event: HTTP_REQUEST_COMPLETED_EVENT, bytes: 0 (io.confluent.connect.s3.storage.S3OutputStream:286)

切割后的字段列表如下:

字段名字段值
msgProgress event: HTTP_REQUEST_COMPLETED_EVENT, bytes: 0
nameio.confluent.connect.s3.storage.S3OutputStream:286
statusDEBUG
time1594105469333000000

修改 kafka.conf 后,需要重启 DataKit 生效。

场景视图

登录观测云控制台,点击「场景」 -「新建仪表板」,输入 “Kafka”, 选择 “Kafka 监控视图”,点击 “确定” 即可添加视图:

关键指标

接下来介绍 Kafka 指标的详细信息。

UnderReplicatedPartitions

UnderReplicatedPartitions 未同步状态的分区个数,即失效副本的分区数,异常值非 0。在运行状况良好的群集中,同步副本(ISR)的数量应完全等于副本的总数。 该值非零表示 Broker 上的 Leader 分区存在没有完全同步并跟上 ISR 的副本的分区数量。可能存在问题:

  • 某个 Broker 宕机。
  • 副本所在磁盘故障/写满,导致副本离线,可以结合 OfflineLogDirectoryCount 指标非 0 值进行判断。
  • 性能问题导致副本来不及同步。可能有两种情况,第一种 Follower 副本进程卡住,在一段时间内根本没向 Leader 发起同步请求,比如频繁 Full GC,第二种 Follower 副本进程同步较慢,在一段时间内无法追赶 Leader 副本,比如 I/O 开销过大。
指标集kafka_replica_manager
指标描述数据类型
UnderReplicatedPartitions处于未同步状态的 Partition 个数int
UnderMinIsrPartitionCount低于最小 ISR Partition 个数。int
OfflineLogDirectoryCount

OfflineLogDirectoryCount 离线日志目录数量,异常值非 0 。需要观测该指标,以检查是否存在脱机日志目录。

指标集kafka_log
指标描述数据类型
OfflineLogDirectoryCount离线日志目录数量int
IsrShrinksPerSec / IsrExpandsPerSec

任意一个分区的处于同步状态的副本数(ISR)应该保持稳定,除非您正在扩展 Broker 节点或删除分区。 为了保持高可用, Kafka 集群必须保证最小 ISR 数,以防在某个分区的 Leader 挂掉时它的 Follower 可以接管。一个副本从 ISR 池中移走有以下一些原因:Follower 的 offset 远远落后于 Leader(改变 replica.lag.max.messages 配置项),或者某个 Follower 已经与 Leader 失去联系了某一段时间(改变 replica.socket.timeout.ms 配置项),不管是什么原因,如果 IsrShrinksPerSec(ISR 缩水) 增加了,但并没有随之而来的 IsrExpandsPerSec(ISR 扩展)的增加,就将引起重视并人工介入。

指标集kafka_replica_manager
指标描述数据类型
IsrShrinksPerSec.CountISR 缩减数量int
IsrShrinksPerSec.OneMinuteRateISR 缩减频率float
IsrExpandsPerSec.CountISR 膨胀数量int
IsrExpandsPerSec.OneMinuteRateISR 膨胀频率float
ActiveControllerCount

ActiveControllerCount 当前处于激活状态的控制器的数量,异常值 0。Kafka 集群中第一个启动的节点自动成为 Controller,有且只能有一个这样的节点、正常情况下 Controller 所在的 Broker 上的这个指标应该是 1,其它 Broker 上的这个值应该是 0。Controller 的职责是维护分区 Leader 的列表,当某个 Leader 不可用时协调 Leader 的变更。如果有必要更换 Controller,一个新的 Controller 将会被 Zookeeper 从 Broker 池中随机的选取出来,通常来说这个值不可能大于 1,但当遇到这个值等于 0 且持续了一段时间 (<1) 的时候,必须发出明确的警告,所以该指标可用作告警。

指标集kafka_controller
指标描述数据类型
ActiveControllerCount.ValueController 存活数量int
OfflinePartitionsCount

OfflinePartitionsCount 没有活跃 Leader 的分区数,异常值非 0。由于所有的读写操作都只在 Partition Leader上进行,任何没有活跃 Leader 的 Partition 都会彻底不可用,且该 Partition 上的消费者和生产者都将被阻塞,直到 Leader 变成可用。该指标可用作告警。

指标集kafka_controller
指标描述数据类型
OfflinePartitionsCount.Value下线 Partition 数量int
LeaderElectionRateAndTimeMs

当 Parition Leader 挂了之后就会触发选举,就会触发新 Leader 的选举。通过 LeaderElectionRateAndTimeMs 可以观测 Leader 每秒钟选举多少次,选举频率。

指标集kafka_controller
指标描述数据类型
LeaderElectionRateAndTimeMs.CountLeader 选举次数int
LeaderElectionRateAndTimeMs.OneMinuteRateLeader 选举比率float
LeaderElectionRateAndTimeMs.50thPercentileLeader 选举比率float
LeaderElectionRateAndTimeMs.75thPercentileLeader 选举比率float
LeaderElectionRateAndTimeMs.99thPercentileLeader 选举比率float
UncleanLeaderElectionsPerSec

当 Kafka Brokers 分区 Leader 不可用时,就会发生 unclean 的 Leader 选举,将从该分区的 ISR 集中选举出新的 Leader。 从本质上讲,unclean leader 选举牺牲了可用性的一致性。 同步中没有可用的副本,只能在未同步的副本中进行 Leader 选举,则前 Leader 未经同步的消息都会永远丢失。UncleanLeaderElectionsPerSec.Count 异常值是不等于 0,此时代表着数据丢失,因此需要进行告警。

指标集kafka_controller
指标描述数据类型
UncleanLeaderElectionsPerSec.CountUnclean Leader 选举次数int
TotalTimeMs

TotalTimeMs 度量本身是四个指标的总和:

  • queue:在请求队列中等待所花费的时间
  • local:领导者处理所花费的时间
  • remote:等待关注者响应所花费的时间(仅当时 requests.required.acks=-1)
  • response:发送回复的时间

TotalTimeMs 用来衡量服务器请求的用时,正常情况下该指标比较稳定,只有非常小的波段,如果发现异常,则会出现不规则的数据波动。这时需要检查各个 queue、local、remote 和 response 的值,定位处造成延迟的原因到底处于哪个 segment。

指标集kafka_request
指标描述数据类型
TotalTimeMs.Count总请求用时int
PurgatorySize

PurgatorySize: 作为一个临时存放的区域,使得生产(produce)和消费(fetch)的请求在那里等待直到被需要的时候。留意 purgatory 的大小有助于确定潜伏期的根本原因。例如,如果 purgatory 队列中获取请求的数量相应增加,则可以很容易地解释消费者获取时间的增加。

指标集kafka_purgatory
指标描述数据类型
Fetch.PurgatorySizeFetch Purgatory 大小int
Produce.PurgatorySizeProduce Purgatory 大小int
Rebalance.PurgatorySizeRebalance Purgatory 大小int
topic.PurgatorySizetopic Purgatory 大小int
ElectLeader.PurgatorySize选举 Leader Purgatory 大小int
DeleteRecords.PurgatorySize删除记录 Purgatory 大小int
DeleteRecords.NumDelayedOperations延时删除记录数int
Heartbeat.NumDelayedOperations心跳监测int
BytesInPerSec / BytesOutPerSec

BytesInPerSec/BytesOutPerSec 传入/传出字节数。通常磁盘吞吐量、网络吞吐量都可能成为瓶颈。 如果您要跨数据中心发送消息,Topic 数量众多,或者副本正在赶上 Leader,则网络吞吐量可能会影响 Kafka 的性能。 通过这些指标,在跟踪 Broker 上的网络吞吐量来判断瓶颈出在何处。

指标集kafka_topics
指标描述数据类型
BytesInPerSec.Count每秒流入字节数int
BytesInPerSec.OneMinuteRate每秒流入速率float
BytesOutPerSec.Count每秒流出字节数int
BytesOutPerSec.OneMinuteRate每秒流出速率float
RequestsPerSec

RequestsPerSec 每秒请求次数。通过观测该指标,可以实时掌握生产者,消费者的请求率,以确保您的 Kafka 高效通信。如果该指标持续维持高位,可以考虑增加生产者或者消费者的数量,进而提高吞吐量,从而减少不必要的网络开销。

指标集kafka_topics
指标描述数据类型
TotalFetchRequestsPerSec.Count每秒拉取请求的次数int
TotalProduceRequestsPerSec.Count生产者每秒写入请求的次数int
FailedFetchRequestsPerSec.CountTopic 失败 Fetch 数量int
FailedProduceRequestsPerSec.Count发送请求失败速率int
其它常用指标
指标集kafka_controller
指标描述数据类型
GlobalTopicCount.Value集群总 Topic 数量int
GlobalPartitionCount.Value分区数int
TotalQueueSize.Value队列总数int
EventQueueSize.Value事件队列数int
指标集kafka_request
指标描述数据类型
RequestQueueTimeMs.Count请求队列时间int
ResponseSendTimeMs.Count相应队列时间int
MessageConversionsTimeMs.Count消息转换时间int
指标集kafka_topics
指标描述数据类型
PartitionCount.ValuePartition 数量int
LeaderCount.ValueLeader 数量int
BytesRejectedPerSec.CountTopic 请求被拒绝数量int

监控器

当前监控器概览如下:

Kafka 处于激活状态的控制器的数量告警

ActiveControllerCount 当前处于激活状态的控制器的数量,异常值 0。Kafka 集群中第一个启动的节点自动成为 Controller,有且只能有一个这样的节点、正常情况下 Controller 所在的 Broker 上的这个指标应该是 1,其它 Broker 上的这个值应该是 0。Controller 的职责是维护分区 Leader 的列表,当某个 Leader 不可用时协调 Leader 的变更。如果有必要更换 Controller,一个新的 Controller 将会被 Zookeeper 从 Broker 池中随机的选取出来,通常来说这个值不可能大于 1,但当遇到这个值等于 0 且持续了一段时间 (<1) 的时候,必须发出明确的警告,所以该指标可用作告警。

Kafka Unclean Leader 选举次数告警

当 Kafka Brokers 分区 Leader 不可用时,就会发生 unclean 的 Leader 选举,将从该分区的 ISR 集中选举出新的 Leader。 从本质上讲,unclean leader 选举牺牲了可用性的一致性。 同步中没有可用的副本,只能在未同步的副本中进行 Leader 选举,则前 Leader 未经同步的消息都会永远丢失。UncleanLeaderElectionsPerSec.Count 异常值是不等于 0,此时代表着数据丢失,因此需要进行告警。

Kafka Parttition Leader 选举次数告警

Kafka 分区 leader 选举是 Kafka 高可用性的关键机制之一。当 Kafka 集群中的某个分区的 leader 节点出现问题时,会触发 leader 选举,以确保消息的高可用性和一致性。监控 leader 选举的次数是有必要的,因为这可以帮助你了解集群的健康状况和潜在的问题。频繁的 leader 选举可能表明集群中存在问题,例如硬件故障、网络问题或者 Kafka 配置不当。在某些情况下,频繁的 leader 选举可能会导致集群性能下降,因为选举过程需要额外的资源和时间。因此,通过设置 LeaderElectionRateAndTimeMs.Count 告警来监控 leader 选举的次数可以帮助及时发现并解决这些问题。

Kafka 离线的分区告警

Kafka 离线分区是指那些没有活跃 Leader 的分区,这种情况可能会导致数据无法被正常读写,因此对 Kafka 集群的稳定性和数据的可用性构成威胁。通过 OfflinePartitionsCount.Value 指标监控离线分区的数量是非常有必要的,发现有分区离线时,应立即发出告警以帮助及时发现和解决集群中的问题。

Kafka 同步副本低于最小 ISR Partition 个数

在 Kafka 中,ISR(In-Sync Replicas)是指与 leader 副本保持同步的副本集合。如果一个分区的同步副本数量低于配置的最小 ISR 分区个数(min.insync.replicas),这可能会影响到数据的可靠性和写入请求的响应。因此,通过 UnderMinIsrPartitionCount.Value 监控 ISR 的状态并设置告警是非常有必要的。

Kafka 未同步状态的 Partition

在 Kafka 中,未同步状态的 Partition 副本指的是那些不在 ISR(In-Sync Replicas)中的副本。如果一个分区的副本没有及时与 leader 副本同步,这可能会导致数据不一致或在 leader 副本失败时无法进行正常的 leader 选举,因此,通过 UnderReplicatedPartitions 对于这种状态的监控和告警是非常有必要的。

Kafka 请求失败数过高

在 Kafka 中,请求的失败数高,可能回影响消息的生产和消费,当请求失败数异常增高时,它通常表明系统正在经历一些需要立即注意的问题,通过 kafka topic 失败请求数量指标 FailedFetchRequestsPerSec.Count 来发现并解决那些影响消息传递稳定性的问题。

总结

总之,监控 Kafka 有助于我们确保系统的健康运行,及时响应和处理各种问题,同时也为系统优化和扩展提供了数据支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/58459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《XGBoost算法的原理推导》12-13树的叶子节点权重w和映射关系q 公式解析

本文是将文章《XGBoost算法的原理推导》中的公式单独拿出来做一个详细的解析&#xff0c;便于初学者更好的理解。 我们重新定义一颗树&#xff0c;包括两个部分&#xff1a; 叶子结点的权重向量 w w w&#xff1b;实例 -> 叶子结点的映射关系 q q q&#xff08;本质是树的…

电商API:开启电商新时代的关键钥匙

一、电商API&#xff1a;定义与发展 电商API&#xff0c;即应用程序编程接口&#xff0c;是连接不同软件系统的桥梁&#xff0c;在电商领域中发挥着至关重要的作用。电商API的发展历程可以追溯到20世纪90年代&#xff0c;当时电子商务刚刚兴起&#xff0c;企业开始意识到通过A…

C++__XCode工程中Debug版本库向Release版本库的切换

Debug和Release版本分别设置编译后&#xff0c;就分别得到了对应的lib库&#xff0c;如下图&#xff1a; 再生成Release后如下图&#xff1a;

消费疲软下,家居品牌如何利用营销实现新的突围与增长?

在消费疲软的大环境下&#xff0c;家居品牌面临着前所未有的挑战与机遇。尤其以耐消品为主的家居行业&#xff0c;也受到一定程度影响——有效需求不足导致产能过剩&#xff0c;营销乏力&#xff0c;市场竞争开始变得激烈&#xff0c;不少家居品牌正在面临业绩压力。家居品牌如…

连985都没有面试机会 二本就更没戏了:瞎说,这就是三年高考的意义

最近有二本同学在直播里说&#xff1a;“看到很多面经说&#xff0c;连985同学都没有面试机会&#xff0c;而且是零offer。那我们二本就更没戏了。” 其实这种言论是在瞎扯。 我们一直在强调校招是分层的。 现在学生太多了&#xff0c;而且招聘对学历是有要求的。比如大厂的…

微信小程序运营日记(第四天)

2024年11月6日-星期三-2024年45周 {微信小程序的时间板块进行一个增加&#xff0c;增加&#xff1a;2024年第45周|共53周&#xff0c;星期三&#xff0c;今年时间剩余&#xff0c;本周时间剩余} 开源竞争&#xff1a; 开源竞争&#xff08;当你无法掌握一个技术就开源这个技术…

高分辨率高电流监控器电路设计

1 简介 该单电源电流检测解决方案可以在分流电阻器上测量50mA 至10A 范围内的电流信号。电流检测放大器可以在0V 至75V 的宽共模电压范围内测量分流电阻器。全差分放大器(FDA) 执行单端至差分转换&#xff0c;并以1MSPS 的最大数据速率驱动范围为5V 的SAR ADC 差分输入。可以调…

ALB搭建

ALB: 多级分发、消除单点故障提升应用系统的可用性&#xff08;健康检查&#xff09;。 海量微服务间的高效API通信。 自带DDoS防护&#xff0c;集成Web应用防火墙 配置&#xff1a; 1.创建ECS实例 2.搭建应用 此处安装的LNMP 3.创建应用型负载均衡ALB实例 需要创建服务关联角…

【客观理性深入讨论国产中间件及数据库-科创基础软件】

随着国产化的进程&#xff0c;越来越多的国企央企开始要求软件产品匹配过程化的要求&#xff0c; 最近有一家银行保险的科技公司对行为验证码产品就要求匹配国产中间件&#xff0c; 于是开始了解国产中间件都有哪些厂家 一&#xff1a;国产中间件主要产品及厂商 1 东方通&…

了解 MybatisPlus中@InterceptorIgnore防止拦截器拦截 基本知识(附Demo)

目录 前言1. 基本知识2. Demo 前言 对于Java基本知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 一开始是因为报错多租户的问题&#xff0…

【解决】Pico 串流 Unity 开发环境 Preview 黑屏问题

开发平台&#xff1a;Unity 6.0 开发工具&#xff1a;Pico SDK   一、问题描述 在 Unity 开发环境下运行 测试 PicoVR 表现时&#xff0c;出现 Game视窗 PicoVR投屏 呈现黑屏效果。详细背景如下&#xff1a; UnitySwitch PlateformPICO Integration SDKPICO Live Preview6…

数据结构与算法——图

图 1.图的定义和表示 图的定义 图G由集合V和集合E组成&#xff0c;记作G(V,E),其中&#xff1a; 1、V是顶点元素的有限集合&#xff1b; 2、E是顶点间关系——边的有限集合。 3、边是顶点的无序对或有序对。 无向图和有向图&#xff1a; 无向图 由没有方向的边构成的图…

HTMLCSS:爱上班的猫咪

这段HTML和CSS代码是一个SVG动画的示例&#xff0c;它描述了一个包含猫咪和笔记本电脑的复杂场景 HTML <div class"content"><div class"container"><svg id"bongo-cat" xmlns"http://www.w3.org/2000/svg" xmlns:x…

CPU Study - Pipeline Basic

参考来源&#xff1a;《超标量处理器设计》—— 姚永斌 超标量处理器 一个程序执行时间的公式如下&#xff0c;而这个公式通常也反映了处理器的性能&#xff1a; 图中的CPI - Cycle Per Instruction也就是CPU每条指令需要的周期数量&#xff0c;CPI计算方法就是周期数量除以…

YOLO即插即用---PConv

Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks 论文地址&#xff1a; 1. 论文解决的问题 2. 解决问题的方法 3. PConv 的适用范围 4. PConv 在目标检测中的应用 5. 评估方法 6. 潜在挑战 7. 未来研究方向 8.即插即用代码 论文地址&#xff1a; …

RoCE与IB对比分析(一):协议栈层级篇

在 AI 算力建设中&#xff0c; RDMA 技术是支持高吞吐、低延迟网络通信的关键。目前&#xff0c;RDMA技术主要通过两种方案实现&#xff1a;Infiniband和RoCE&#xff08;基于RDMA的以太网技术&#xff0c;以下简称为RoCE&#xff09;。 RoCE与IB网络架构概述 RoCE和InfiniBa…

AI - 使用LangChain请求LLM结构化生成内容

AI - 使用LangChain请求LLM结构化生成内容 基于深度学习的大型语言模型&#xff08;LLM&#xff09;不仅可以生成文本&#xff0c;还可以帮助我们完成许多复杂任务&#xff0c;如自动化客服、内容创作和数据分析。然而&#xff0c;如何从这些模型中结构化地获取输出&#xff0c…

Linux基础-常用操作命令详讲

Linux基础-常用操作命令详讲 一、openssl加密简单介绍 1. 生成加密的密码散列&#xff08;password hash&#xff09;​编辑 1.1 常见的选项总结表 1.2 加密参数详解 2. 自签名证书 3. 证书转换 二、文件管理 1. 创建空文件 ​编辑 2. 删除文件 4. 新建目录 ​编辑…

Windows、Linux系统上进行CPU和内存压力测试

CPU和内存压力测试 1. Linux环境 Linux环境下&#xff0c;我们可以用 stress 工具进行内存、CPU等的压力测试。 【1】. stress工具说明 [kalamikysrv1 ~]$ stress --help stress imposes certain types of compute stress on your systemUsage: stress [OPTION [ARG]] ...-…

JVM知识点大全(未完...)

JVM运行时数据区域 堆 堆是Java虚拟机中用于存储对象的主要区域&#xff0c;包括字符串常量池。绝大多数对象都是在堆中创建的&#xff08;少部分对象可能会在栈上分配&#xff09;。为了更好地进行垃圾回收&#xff0c;堆被划分为年轻代和老年代两部分。年轻代又被进一步分为E…