前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java虚拟机 CMS GC 调优解析

Java虚拟机 CMS GC 调优解析

作者头像
Luga Lee
发布于 2021-12-09 13:04:14
发布于 2021-12-09 13:04:14
71300
代码可运行
举报
文章被收录于专栏:架构驿站架构驿站
运行总次数:0
代码可运行

随着 JDK 版本的不断升级,其 GC 策略也随之不停革新,从早期的 1.4 到如今的 11(本文仅讨论在线上环境落地规模较大的版本),其对应的 GC 策略也随之由 Serial、Parallel、CMS 演进至当前的 G1 甚至即将落地的 ZGC 。每一次的调整无不是基于环境的适配性以及业务场景特性,无论如何,只要能够基于特定的操作系统内核、物理内存、JDK版本以及业务特性,达到收益最大化,采用何种实现策略都不为过。当然,还是建议大家以官方的推荐为准,基于自己的业务场景进行不断优化调整,这样才能保证万无一失,使得我们的业务能够健康发展。

本文主要以 CMS GC 为核心,简要解析有关在基于CMS GC 策略下进行 Java 虚拟机调优的最佳实践建议。涉及常见关键症状、堆空间以及 GC Log。此最佳实践建议适用于在 Java® 8上运行的AM / OpenAM、DS / OpenDJ、IDM / OpenIDM和IG /OpenIG。其实,从本质上讲,Java 虚拟机调整并不是一门精确的科学理论,因为它会因各个环境差异性和应用程序多样性而表现的有所不同。基于对当前环境进行一致的压力及稳定性测试才是评估所优化调整影响业务场景的唯一真实方法及指导。

那么,在现实的业务场景中,我们是如何决策优化呢?在开始进行 Java 虚拟机调整之前,笔者建议大家需要关注以下几点:

1、 内存泄漏

Memory leaks 内存泄漏问题,几乎伴随着整个 Java 虚拟机生态,基于不同的应用场景,其表现形式为多样化。因此,如果无论我们基于何种方式的调整,其效果往往不是那么理想,这些可疑点可能总会导致垃圾回收(GC)问题。此点为 Java 虚拟机性能调整过程中所必须面对、解决的。 例如,应用中的一些对象不再被应用程序使用同时垃圾收集无法识别的情况。因此,这些未使用的对象仍然在 Java 堆空间中无限期地存在。不停的堆积最终会触发 java.lang.OutOfMemoryError 错误。

2、资源成本

关于成本问题,视公司的实际情况而定,仁者见仁,智者见智。技术实力落后的团队,更倾向于增加更多的硬件设备资源来提高性能,毕竟,现在的资源相比之前成本低多了。然而,技术实力足够牛逼的团队,更愿意从本质上,即技术层面非资源层面,去解决问题。毕竟,后者更能够对整个业务系统的瓶颈、缺陷有所了解、把控,更能在后续的容量规划中提供有价值的参考数据作为支撑,虽然后者可能耗费较多时间成本,但基于后续的业务规划而言,其相比前者更具有战略价值。这也是笔者所推崇的。

3、近期规划

我们都知道,性能调优是一个持久的过程,针对我们自己的业务场景所规划的函数模型,例如:P 的表现值由(x、y、z、...)*r 等多个不同性能因子决定,那么,可能在某一有限的项目活动周期内,我们可能无法顾及所有的性能因子,因此,就需要进行优先级决策,从影响的大小或者范围进行降级排序,然后对选择的性能因子进行验证,调整,完善,当然,也有可能其中的某些因子本身就互逆,导致某些场景失效。所以,如果需要解决根本问题,则调优只能以阶段性规划为导向局部因素调整来满足当前项目周期内的业务痛点。

4、最终期望

基于上述3点所述,在我们解决当前环境中的核心痛点后,需要从业务角度去优化后续带来的挑战,例如,新业务的落地、流量的剧增以及其他场景对当前系统架构产生影响的各个方面。因此,从长远规划来看,架构的稳定性比调整单纯的性能更为重要,尽管存在重叠。

本文主要基于笔者当前公司的应用环境,主要采用 Java 8。在 Java 8中,CMS 是默认的垃圾收集器,其核心目标为倾向于以最少的垃圾收集暂停时间提供最佳的性能特性。因此,只有当我们的应用服务在进行性能对比,在基于 CMS 策略下,其效能不能够支撑我们的业务需求场景下,才考虑尝试使用 G1 或者其他的垃圾收集器。下面,我们针对 Java 虚拟机中核心的组件进行简要解析,以帮助大家能够更深入了解其运行原理及管理机制。在进行解析之前,我们先来了解下 Java 虚拟机体现架构,具体如下示意图所示:

从上面架构图可以看出,各个组件在整个 Java 虚拟机体系中的位置以及发挥的作用。关于 Java 虚拟机体系架构的详细解析,暂不在本章中所述,大家有兴趣可以去官网查阅。

Heap

什么是堆?它能干嘛?何时需要对它进行调整?Java 堆是分配给在 JVM中运行应用程序的内存资源池。堆内存中的对象可以在线程之间共享。垃圾回收(GC)是指管理运行时内存的自动调节过程。JVM 会随着 GC Pause的影响,其频率、持续时间各不相同。如果这些暂停变得更加频繁或持续更长的时间,表明我们的应用程序可能需要调整 Java堆。

在实际的业务场景中,通常我们会指定初始堆 -Xms 与最大堆 -Xmx,并对其分配内存的大小尽可能一致,以获得最优的性能表现。否则,JVM 在增加其堆时会运行完整的垃圾收集器(GC)周期,在此期间,JVM 可以将正在进行的操作暂停几秒钟。通常,较小的堆会增加 JVM GC 的执行频次,但会减少持续时间。同样,较大的堆将减少频率并增加持续时间。调整 JVM 堆时,我们的初衷目标在于在频率和持续时间之间取得平衡,以减少 GC 对应用程序的影响。

下面,我们来看一下整个 JVM 内存的资源分配示意图,具体如下所示:

基于上述参考图,堆最初是在 JVM 启动时创建的,并将其划分为不同的“空间”或“代”,其中,核心的是 Young(新生)和 Tenured(老年):

Young 代用于新生对象。GC 进程(ParNew)变满时会自动运行,该进程将删除未使用的对象并将所有生存时间足够长的对象移至 Tenured 代,从而释放 Young 代中用于更多新对象的空间。通常,年轻代中的对象是短暂且短暂的。虽然很小,但活跃,GC 经常发生,但对性能的影响有限。

Tenured 代用于寿命更长的对象,也就是我们所说的老年对象。另一个 GC 进程(CMS)变满时将运行,以删除所有未使用的对象。与 Young 代相比,Tenured 代更大且不那么活跃,但是 GC 往往会对性能产生更大的影响。

那么,什么时候需要对 Heap 下手呢?通常,当业务场景出现如下表现时,可考虑进行调整,具体:

1、CPU使用率过高

当我们的程序处理能力无法满足实际的业务需求,通过后台 GC Log 查看,出现大量的 Full GC,频繁的 Full GC 操作需要耗费大量的 CPU 时间片,所以,我们会看到 CPU 出现激增情况。

2、应用服务挂起

当我们的应用程序假死并停止响应时,前端显示 500 或者业务中断,同时,日志文件中也将不会输出相关有价值的信息,或者我们在执行某一定时任务时遇到一般响应缓慢的情况,则可能是内存分配异常导致。

3、大量的转储文件生成

针对内存层面,当 JVM 中对象过多, Java堆耗尽时,就会产生 Java Heap Dump文件,通常以 .heapdump 或 .hprof 格式展现。此文件较大,最小大于1G,最大不限制,通常大约在2~10 G之间,不断地生成此类文件,很容易使得磁盘打爆,服务挂掉。针对 CPU 层面,则往往会生成较多的 javacore.txt 文件,此文件伙同堆转储文件。

GC Loging

接下来,我们来了解下 GC Log 相关方面细节。通常,在基于 Java 8 ,建议大家优先采用 CMS(Concurrent Mark Sweep),它是一个吞吐量收集器,在与应用程序同时运行时往往会提供最佳性能,这意味着较少的暂停时间。实际的场景中,通过设置以下 JVM 选项来指定此收集器,具体如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-XX:+UseConcMarkSweepGC

ParNew 部分

ParNew 部分的 GC 日志输出示例,具体如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
21.222: [GC21.222: [ParNew: 535347K->39439K(623550K), 0.0394310 secs] 584661K->87777K(3102652K), 0.0401790 secs] [Times: user=0.17 sys=0.00, real=0.04 secs] 
26.525: [GC26.525: [ParNew: 583983K->27488K(623550K), 0.0868170 secs] 614171K->104810K(3102652K), 0.0875620 secs] [Times: user=0.24 sys=0.01, real=0.09 secs]

该日志文件中的每一行代表一个 GC,并显示有关 ParNew 的以下类型的信息:

1、时间戳信息-如果未设置 PrintGCTimeStamps 和 PrintGCDateStamps 选项,则仅以 JVM 启动后的秒数显示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
21.222: [GC21.222:
26.525: [GC26.525:

此信息很关键,因为它显示了 GC 的频率。 假设我们定义的目标是使 GC 每1到5秒发生一次;如果它们每秒发生一次以上,则需要调整 JVM,并且很有可能会看到很高的CPU使用率。

2、年轻代信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[ParNew: 535347K->39439K(623550K), 0.0394310 secs] 
[ParNew: 583983K->27488K(623550K), 0.0868170 secs]

此信息显示执行 GC 之前的 Young 空间的初始大小,执行 GC 之后的大小,可用的总大小以及执行 GC 所需的时间。如果执行 GC 所需的时间过长(超过0.1秒),则可能是您的 Young Generation堆大小太大。如果将 NewSize 和 MaxNewSize 设置为相同的值,则可用的总大小不会增加,这就是我们希望在日志中看到的大小。

3、总分配堆信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
584661K->87777K(3102652K), 0.0426850 secs]
614171K->104810K(3102652K), 0.0892180 secs]

此信息显示执行 GC 之前的总体堆的初始大小,执行 GC 之后的大小以及可用的总大小。使用第二批数据(完成 GC 后的大小),我们可以看到它如何逐渐增长到完成 GC 时的水平,然后又减小到基线数据。如果发生内存泄漏,即使执行完 GC 后,基线数字也会逐渐增加,因为它越来越满。

4、系统耗时信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Times: user=0.13 sys=0.00, real=0.02 secs] 
[Times: user=0.27 sys=0.02, real=0.11 secs]

该信息显示了在用户空间上花费了多少时间,在内核或系统空间上花费了多少时间以及对用户的真正影响是什么。如果用户时间过长,则表明没有足够的CPU来容纳用户线程数。如果系统时间过长,则表明应用系统正在将内存交换到磁盘,这意味着没有足够的物理内存来满足您的堆大小。

CMS 部分

日志文件的 CMS 部分与 ParNew 部分不同,因为它显示了同一 GC 的多行。CMS部分的示例 GC 日志输出如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
30.136: [GC [1 CMS-initial-mark: 26386K(786432K)] 26404K(1048384K), 0.0074495 secs]
30.144: [CMS-concurrent-mark-start]
30.663: [CMS-concurrent-mark: 0.521/0.529 secs]
340.663: [CMS-concurrent-preclean-start]
30.801: [CMS-concurrent-preclean: 0.017/0.018 secs]
30.804: [GC40.704: [Rescan (parallel) , 0.1790103 secs]40.883: [weak refs processing, 0.0100966 secs] [1 CMS-remark: 26386K(786432K)] 52644K(1048384K), 0.1897792 secs]
30.984: [CMS-concurrent-sweep-start]
31.020: [CMS-concurrent-sweep: 0.126/0.126 secs]
31.020: [CMS-concurrent-reset-start]
31.135: [CMS-concurrent-reset: 0.127/0.127 secs]

该日志显示了 GC 经历的不同阶段。所有标记为并发的事件都是在应用程序运行时发生的,因此影响很小。CMS 初始标记和 CMS 标记显示堆大小调整详细信息。

通常,在实际的业务场景中,我们往往会看到这些部分日志打印混杂在一起,例如,某些 ParNews 比 CMS 多一些,ParNews多一些,另一个CMS 等,因为 GC 进程会自动发生以管理堆。

CMS GC 常见场景分析

此部分内容主要解析在基于 CMS 策略时,出现的各种场景以及针对性的解决方案,以便大家能够掌握此处内容。

1、年轻代分配过小

以下日志片段显示了 Young 代堆大小太小的问题,具体如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1.813: [GC1.813: [ParNew: 1152K­>128K(1152K), 0.0008100 secs] 16620K­->15756K(26936K), 0.0008350 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
1.816: [GC1.816: [ParNew: 1152K­>128K(1152K), 0.0006430 secs] 16780K­->15913K(26936K), 0.0006640 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
1.819: [GC1.819: [ParNew: 1152K­>128K(1152K), 0.0005370 secs] 16937K-­>16038K(26936K), 0.0005570 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

基于上述 GC Log 输出,我们可以看到:在1秒钟内发生了多个 GC。这意味着应用程序需要增加 Young 代的大小(NewSize和MaxNewSize),还可能需要增加总堆大小以补偿此更改(Xms和Xmx)。或者,可以更改 NewRatio 选项(默认情况下设置为2,这意味着 Tenured 代堆的大小是 Young 代堆的两倍,或者 Young 代堆的大小是 Tenured 世代堆大小的1/3。)。

2、老年代分配过小

以下日志片段显示了一个问题,其中,Young 代堆大小太大,因此 Tenured 代堆大小太小,具体如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
275.616: [GC (CMS Initial Mark) [1 CMS-initial-mark: 104176K(135168K)] 2758985K(6741248K), 0.8762860 secs] [Times: user=0.88 sys=0.00, real=0.88 secs] 
276.583: [CMS-concurrent-mark-start]
276.657: [CMS-concurrent-mark: 0.063/0.065 secs] [Times: user=0.12 sys=0.00, real=0.06 secs] 
276.657: [CMS-concurrent-preclean-start]
276.657: [CMS-concurrent-preclean: 0.001/0.001 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
276.657: [CMS-concurrent-abortable-preclean-start]
276.657: [CMS-concurrent-abortable-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
276.657: [GC (CMS Final Remark)[YG occupancy: 2657419 K (6606080 K)]277.658: [Rescan (parallel) , 0.9815460 secs]278.639: [weak refs processing, 0.0000320 secs]278.640: [scrub string table, 0.0011700 secs] [1 CMS-remark: 104176K(135168K)] 2761595K(6741248K), 0.9828250 secs] [Times: user=7.18 sys=0.09, real=0.99 secs] 
277.631: [CMS-concurrent-sweep-start]
277.658: [CMS-concurrent-sweep: 0.026/0.027 secs] [Times: user=0.03 sys=0.00, real=0.02 secs] 
277.658: [CMS-concurrent-reset-start]
277.658: [CMS-concurrent-reset: 0.001/0.001 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
280.673: [GC (CMS Initial Mark) [1 CMS-initial-mark: 104079K(135168K)] 2774091K(6741248K), 0.9033730 secs] [Times: user=0.90 sys=0.00, real=0.90 secs] 
281.577: [CMS-concurrent-mark-start]
281.640: [CMS-concurrent-mark: 0.063/0.063 secs] [Times: user=0.13 sys=0.00, real=0.07 secs] 
281.640: [CMS-concurrent-preclean-start]
281.641: [CMS-concurrent-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
281.641: [CMS-concurrent-abortable-preclean-start]
281.641: [CMS-concurrent-abortable-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
281.641: [GC (CMS Final Remark)[YG occupancy: 2670011 K (6606080 K)]281.641: [Rescan (parallel) , 0.9914290 secs]282.633: [weak refs processing, 0.0000110 secs]282.633: [scrub string table, 0.0008100 secs] [1 CMS-remark: 104079K(135168K)] 2774091K(6741248K), 0.9923100 secs] [Times: user=7.14 sys=0.11, real=0.99 secs] 
282.634: [CMS-concurrent-sweep-start]
282.659: [CMS-concurrent-sweep: 0.024/0.025 secs] [Times: user=0.06 sys=0.01, real=0.02 secs] 
282.659: [CMS-concurrent-reset-start]
282.659: [CMS-concurrent-reset: 0.001/0.001 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

如上述 GC Log 所见,CMS 回收的发生频率很高,而两者之间没有任何 ParNew 回收。这是由于 Young 代堆大小太大而导致每次发生 ParNew 回收时,Tenured 堆大小都会立即变满并运行 CMS 回收。如果我们在不增加总堆大小的情况下增加了 Young 代的堆大小,则可能会发生这种情况。如果有内存泄漏,也可能发生此日志摘要信息。

针对 CMS 场景中的 CMS Failure、Full GC 以及其他相关内容,可参考之前文章,具体链接为:CMS 触发GC(Allocation Failure)解析

最后,从宏观角度,针对系统调优,笔者给出以下建议,具体:

1、尽可能对当前的应用系统进行负载/压力测试,以建立性能基线。

2、在进行调优时,尽可能每次只调整其中一个性能因子,观测及记录每一次的优化结果,必要时进行恢复。

至此,关于 Java虚拟机 CMS GC 调优解析相关内容本文到此为止,大家有什么疑问、想法及建议,欢迎留言沟通。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构驿站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
架构师之路一-架构师入门指引
导读:本系列文章教你怎么样成为一名架构师,而本篇文章则带你先认识一下什么是架构师,架构师的工作是什么?
JAVA日知录
2020/03/12
3.3K0
如何成为合格的架构师
一直以来,在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解。甚至于很多架构师一说架构,就开始谈论什么应用架构、硬件架构、数据架构等等。我曾经也到处寻找过架构的定义,请教过很多人,结果发现,没有大家都认可的定义。套用一句关于 big data 流行的笑话,放在架构上也适用:
leon公众号精选
2022/04/27
2810
如何成为合格的架构师
浅谈软件架构师的素质与职责
最近开始学习如何成为一名合格的架构师。首先参照别人的观点,在结合自己的实际经验,写出自己对如何成为一名架构师的理解,希望大家热心于与援手,能够指点一二. 沟通能力和自我表达 我认为沟通能力是基本中的基本,最为重要,最为普遍的素质。技术人员好像容易忽略,想成为架构师就不能忽略。因为架构师要做的第一件事就是与团队成员、项目经理、客户认同沟通,获得认同。我知道,这对于现在做技术,以后想转做架构的人也许很难.对本人也是如此。也许 你会注意到虽然你兢兢业业,老黄牛的做了很多事,但每次升迁的总是那些平时最活跃的人。抛除
张善友
2018/01/30
6740
【技术一号位指南🧭】谈谈我眼中的架构师
微软对架构师有一个分类:企业架构师EA(Enterprise Architect)、基础结构架构师IA(Infrastructure Architect)、特定技术架构TSA(Technology-Specific Architect)和解决方案架构师SA (Solution Architect)。这个分类是按照架构师专注的领域不同而划分。
小诚信驿站
2023/05/14
2.5K0
【技术一号位指南🧭】谈谈我眼中的架构师
系统架构设计师|关于系统架构设计师(下)
本篇为系统架构设计师的第二篇,主要说说何为系统架构设计师,他与系统架构之间的关系以及如何成为系统架构设计师,如有描述不清,还望指出。
六月暴雪飞梨花
2024/08/20
7780
系统架构设计师|关于系统架构设计师(下)
业务架构师、系统架构师、软件架构师:八卦三者的混淆与现象
相比于系统和软件的架构师,业务架构师更倾向于站在更高的战略层面,涉及商业分析、战略规划等。许多技术人员可能并未完全理解业务架构师的工作内容和重要性。
运维开发王义杰
2023/08/10
5120
业务架构师、系统架构师、软件架构师:八卦三者的混淆与现象
资深架构师十年总结:成为架构师,你必须具备这五点能力
作者 | Alan Tai 译者 | 冬雨 策划 | 闫园园 在过去的 20 年里,作为一名软件工程师和软件架构师,我与不同领域和不同学科的软件工程师聊过很多次。他们中有一些人是有着 8 到 10 年经验的高级工程师,有许多人还在职业生涯早期,有着 3 到 5 年的经验。其中一些人是我的同事。有些人是求职者。聊到最后,他们几乎都会问到同样一个问题: “我想成为一名解决方案架构师。了解更多架构相关内容的资源有哪些?“——很多软件工程师都会问的一个问题。 他们问错了问题。如果你读下去,就会知道为什么我
深度学习与Python
2023/03/29
5840
资深架构师十年总结:成为架构师,你必须具备这五点能力
架构师成长之路系列(一)
Architect,即架构一词可以溯源到希腊语ἀρχιτέκτων , 指的是建筑的规划,设计和建造过程和结果。现在也用于指系统的网络,软件,硬件的规划,设计和搭建过程。所以架构师就是从事架构设计的人。
数字悠客
2020/09/18
6040
干了5年程序员,该如何转行?5个新工作方向了解一下
写了5年代码,年龄已近30,头发尚存几缕,除了写代码其他并无所长,职业未来在何方?
大数据文摘
2019/10/29
1.4K0
干了5年程序员,该如何转行?5个新工作方向了解一下
业务架构师、系统架构师、软件架构师:职责、技能要求及对比分析
业务架构师、系统架构师和软件架构师在企业技术层面扮演着不同角色,各自有其独特的职责和技能要求。了解和明确这三者的不同,有助于组织有效地分配资源和角色,促进企业的技术和业务目标的实现。
运维开发王义杰
2023/08/10
3.5K0
业务架构师、系统架构师、软件架构师:职责、技能要求及对比分析
BAT资深架构师告诉你从程序员到架构师,你需要掌握什么能力?
架构师和开发者一样,也经常写代码,简单的说,开发者和架构师之间最大的区别就是技术领导力。
java架构师
2018/08/23
8460
Java程序员通往架构师的修炼之路
国内我们对架构师,项目经理,开发经理或者是技术总监这类职业定位普遍不都不清晰,很多的情况是“能者多劳”,一人身兼数职。达尔文的理论在我们的行业是绝对适用的,我从进入这个行业开始我就不甘于成为淘汰者,而我也由心地热爱着这个行业很年前我就立志要成为架构师(当年流行叫:系统分析员 )这目标进发。回首这10几年的磨练,我总结了一下一名合格的架构师应该具备哪一些方面的能力以及怎么才能得到这些能力 一、编码能力 架构师是一个职业,是一种经历了各种磨练与长年开发经验积累出来的。另外我一直认为:不会编码的架构师不是一个好的
Java架构
2018/07/06
3850
为什么你总成为不了架构师?
一,背景 今天接到一个哥们儿的电话,说,很郁闷,想和我聊聊。 我问,有啥郁闷的事情啊,说来听听。 他说,最近很郁闷,我本来今年的计划是成为一个架构师,但是,无论如何努力,都不知道为什么,感觉希望很渺茫
架构师小秘圈
2018/04/02
6410
为什么你总成为不了架构师?
设计图都不会画,还想做”架构师“?
什么是系统架构师? 系统架构师是一个既需要掌控整体又需要洞悉局部瓶颈并依据具体的业务场景给出解决方案的团队领导型人物。一个架构师得需要足够的想像力,能把各种目标需求进行不同维度的扩展,为目标客户提供更为全面的需求清单。 架构师在软件开发的整个过程中起着很重要的作用。 如何才能成为系统架构师? 首先必须具有丰富的软件设计与开发经验,这有助于理解并解释所进行的设计是如何映射到实现中去。 其次要具有领导能力与团队协作技能,软件架构师必须是一个得到承认的技术领导,能在关键时候对技术的选择作出及时、有效的决定。 第三
互扯程序
2018/03/26
26.9K2
设计图都不会画,还想做”架构师“?
成为java架构师需要具备那些技能?
大家好,又见面了,我是你们的朋友全栈君。架构师定义 百度百科,系统架构师是一个既需要掌控整体又需要洞悉局部瓶颈并依据具体的业务场景给出解决方案的团队领导型人物。 架构师工作职能 软件架构师在整个软件开发过程中都起着重要的作用,并随着开发进程的推进而其职责或关注点不断地变化,在需求阶段,软件架构师主要负责理解和管理非功能性系统需求,比如软件的可维护性、性能、复用性、可靠性、有效性和可测试性等等,此外,架构师还要经常审查客户及市场人员所提出的需求,确认开发团队所提出的设计;在需求越来越明确后,架构师的关注点开始转移到组织开发团队成员和开发过程定义上;在软件设计阶段,架构师负责对整个软件体系结构、关键构件、接口和开发政策的设计;在编码阶段,架构师则成为详细设计者和代码编写者的顾问,并且经常性地要举行一些技术研讨会、技术培训班等;随着软件开始测试、集成和交付,集成和测试支持将成为软件架构师的工作重点;在软件维护开始时,软件架构师就开始为下一版本的产品是否应该增加新的功能模块进行决策。 成为java架构师所需要具备那些技能? 所谓架构师,思考的是全局的东西,是如何组织你的系统,以达到业务要求,性能要求,具备可扩展性(scalability),可拓展性(extendability),前后兼容性等。可能涉及到的东西包括了从硬件到软件的方方面面,实在是一言难尽。 既然java架构师,首先你要是一个高级java攻狮城,熟练使用各种框架,并知道它们实现的原理。jvm虚拟机原理、调优,懂得jvm能让你写出性能更好的代码;池技术,什么对象池,连接池,线程池…:;java反射技术,写框架必备的技术,但是有严重的性能问题,替代方案java字节码技术;nio,没什么好说的,值得注意的是”直接内存”的特点,使用场景;java多线程同步异步;java各种集合对象的实现原理,了解这些可以让你在解决问题时选择合适的数据结构,高效的解决问题,比如hashmap的实现原理,好多五年以上经验的人都弄不清楚,还有为什扩容时有性能问题?不弄清楚这些原理,就写不出高效的代码,还会认为自己做的很对;总之一句话越基础的东西越重要,很多人认为自己会用它们写代码了,其实仅仅是知道如何调用api而已,离会用还差的远。 熟练使用各种数据结构和算法,数组、哈希、链表、排序树…,一句话要么是时间换空间要么是空间换时间,这里展开可以说一大堆,需要有一定的应用经验,用于解决各种性能或业务上的问题。 熟练使用linux操作系统,必备,没什么好说的。 熟悉tcp协议,创建连接三次握手和断开连接四次握手的整个过程,不了解的话,无法对高并发网络应用做优化;熟悉http协议,尤其是http头,我发现好多工作五年以上的都弄不清session和cookie的生命周期以及它们之间的关联。 系统集群、负载均衡、反向代理、动静分离,网站静态化。 分布式存储系统nfs,fastdfs,tfs,Hadoop了解他们的优缺点,适用场景。 分布式缓存技术memcached,redis,提高系统性能必备,一句话,把硬盘上的内容放到内存里来提速,顺便提个算法一致性hash。 工具nginx必备技能超级好用,高性能,基本不会挂掉的服务器,功能多多,解决各种问题。 数据库的设计能力,mysql必备,最基础的数据库工具,免费好用,对它基本的参数优化,慢查询日志分析,主从复制的配置,至少要成为半个mysqldba。其他nosql数据库如mongodb。 还有队列中间件。如消息推送,可以先把消息写入数据库,推送放队列服务器上,由推送服务器去队列获取处理,这样就可以将消息放数据库和队列里后直接给用户反馈,推送过程则由推送服务器和队列服务器完成,好处异步处理、缓解服务器压力,解藕系统。 想成为架构师不是懂了一大堆技术就可以了,这些是解决问题的基础、是工具,不懂这些怎么去提解决方案呢?这是成为架构师的必要条件。 架构师还要针对业务特点、系统的性能要求提出能解决问题成本最低的设计方案才合格,人家一个几百人用户的系统,访问量不大,数据量小,你给人家上集群、上分布式存储、上高端服务器,为了架构而架构,这是最扯淡的,架构师的作用就是第一满足业务需求,第二最低的硬件网络成本和技术维护成本。 架构师还要根据业务发展阶段,提前预见发展到下一个阶段系统架构的解决方案,并且设计当前架构时将架构的升级扩展考虑进去,做到易于升级;否则等系统瓶颈来了,出问题了再去出方案,或现有架构无法扩展直接扔掉重做,或扩展麻烦问题一大堆,这会对企业造成损失。
全栈程序员站长
2022/09/08
3690
师傅引进门,修行在个人--架构培训感言
成为一个优秀的架构师还有很长的路要走(软件架构案例分析和最佳实践培训收获) 2009-12-25到27日我们参加了某软件培训机构的的《软件架构案例分析和最佳实践》课程培训,开拓了眼界,收获很多,刘老师讲得不错,非常有实战经验,跟他学到了不少有关软件架构的知识,可惜的是3天的培训课程不可能完全掌握所有知识,师傅只是给我们打开了一扇门,指出了一个方向,成为一个优秀的架构师还有很长的路要走。 新视野 “软件架构”定义的决策因素 定义1:架构是一系列重要决策的集合 一直以来,学习架构,使用架构,关注点都仅限
用户1177503
2018/02/26
1K0
想要成为一个合格的架构师?看这篇文章就足够了......
在互联网圈,架构师这个名号的火热程度堪比产品经理,它在产品经理没火之前就已经风生水起。
Java高级架构
2018/10/22
6750
想要成为一个合格的架构师?看这篇文章就足够了......
架构师的成长之路
Architect,即架构一词可以溯源到希腊语ἀρχιτέκτων , 指的是建筑的规划,设计和建造过程和结果。现在也用于指系统的网络,软件,硬件的规划,设计和搭建过程。所以架构师就是从事架构设计的人。
BUG弄潮儿
2020/09/28
5920
架构师的成长之路
.NET 云原生架构师训练营(模块一 架构师与云原生)--学习笔记
Software architecture = {Elements, Forms, Rationale/Constraints}
郑子铭
2020/10/11
7400
.NET 云原生架构师训练营(模块一 架构师与云原生)--学习笔记
【说站】php架构师是做什么的
(1)架构师只对最终需求进行审查和确认,并提出需求不清和不完整的部分,他总是与需求分析师取得联系。架构师是技术专家,不是业务专家。
很酷的站长
2022/11/23
5310
【说站】php架构师是做什么的
推荐阅读
相关推荐
架构师之路一-架构师入门指引
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档