热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【面经】面试官:做过性能优化的工作吗?你会从哪些方面入手做性能优化呢?

写在前面随着互联网的高速发展,互联网行业已经从IT时代慢慢步入到DT时代。对于Java程序员的要求越来越高,只是单纯的掌握CRUD以不足以胜任互联网公司的相关职位,大量招聘岗位显示


写在前面


随着互联网的高速发展,互联网行业已经从IT时代慢慢步入到DT时代。对于Java程序员的要求越来越高,只是单纯的掌握CRUD以不足以胜任互联网公司的相关职位,大量招聘岗位显示:如果是面试中高级的Java岗,基本上都需要懂性能优化的相关知识。今天,我们就一起来聊聊一个经典的面试题:做过性能优化的工作吗?你会从哪些方面入手做性能优化呢?




问题分析

标题中问出了两个问题,一个是有没有做过性能优化的工作,一个是从哪些方面入手做性能优化。对于第一个问题,我们可以直接回答有或者没有。相信小伙伴们都希望自己做过性能优化的工作,如果是回答做过,那第二个问题,我们又该如何回答呢?

首先,对于第二个问题来说,问的是会从哪些方面入手。这个问题就没有固定答案了。你可以按照你以往的经验来回答这个问题,但是,在回答这个问题之前,需要先好好梳理下你的思路,将你要表达的说清楚。

接下来,我们就一起来聊聊第二个问题:你会从哪些方面入手做性能优化?

我们可以从性能优化的几个方面来进行回答。下面,我们就来聊聊性能优化可以从哪些方面进行。



性能优化有哪些方面?

这里,我结合平时工作中的总结,将性能优化总结为下面这张图。

在这里插入图片描述

也就是说,我们可以从数据聚合优化、资源冲突优化、算法优化、JVM优化、复用优化、计算优化和快速实现等方面来进行回答。接下来,我们就针对每个点进行说明。



数据聚合优化

数据聚合优化主要针对的是对于数据的整合和传输的优化。比如:我们从数据库中查询出的数据,经过程序的聚合处理后再返回给客户端,而不用客户端调用多次接口来分别获取数据。

再比如:我们在项目中使用的Nginx,一般都会开启GZIP压缩,使传输的数据更加紧凑,同时,使传输的数据量更小。

细心的小伙伴会发现,我们对于数据聚合的优化,主要是使传输的数据量更小。所以,我们在使用SQL语句查询数据库中的数据时,尽量查询那些需要的字段,对于不需要的字段就直接忽略不查询了,避免在SQL语句中出现select *



资源冲突优化

在我们平时的工作中,尤其是在高并发的场景下,经常会出现锁冲突的问题,锁冲突是资源冲突的一个典型场景。

关于锁我们可以联想到数据库的行锁、表锁、Java中的synchronized和Lock等。如果对应到操作系统级别,则会有CPU命令级别的锁,JVM指令级别的锁,操作系统的内部锁等。

这里,小伙伴们需要注意一点:只有在并发的场景下,才会出现资源冲突的问题。也就是说:在同一时刻,只能有一个请求获取到请求资源,解决冲突的方式就是加锁。

我们需要在平时的工作过程中避免锁冲突的问题,优化如何优化加锁方式,小伙伴们可以参见《【高并发】面试官:讲讲高并发场景下如何优化加锁方式?》一文。



算法优化

在一个大型的互联网项目中,往往涉及到分布式和微服务等技术,其中,也会使用到大量的数据结构和算法,对于算法的优化能够显著的提高系统的性能。一个好的实现,相比于一个拙劣的实现来说,在系统性能的提升上存在着巨大的差异。

比如,作为 List 的实现,LinkedList 和 ArrayList 在随机访问的性能上,差了好几个数量级;又比如,CopyOnWriteList 采用写时复制的方式,可以显著降低读多写少场景下的锁冲突。而什么时候使用同步,什么时候是线程安全的,也对我们的编码能力有较高的要求。

所以,我们需要在平时工作过程中,多多积累数据结构和算法的相关知识。



JVM优化

JVM调优,不用说,这是每个Java工程师必须要掌握的标准技能。所有的Java程序最终都是运行在JVM中的,对JVM进行优化也能够提升Java程序的性能。但是,需要注意的是:如果在优化JVM时,参数设置不当,可能会造成内存溢出等严重的问题。

目前被广泛使用的垃圾回收器是 G1,通过很少的参数配置,内存即可高效回收。CMS 垃圾回收器已经在 Java 14 中被移除,由于它的 GC 时间不可控,有条件应该尽量避免使用。



复用优化

复用优化,这个看名字就知道,说白了就是可以重复利用。估计很多小伙伴都有这样的经验,在写代码的时候,可以将很多重复的代码抽象出来,做成公共的方法。这样,就不用每次都去写重复的逻辑代码了。这是代码层面的复用。

如果是数据层面的话,我们可以使用缓冲和缓存来复用数据。

这里,小伙伴们需要注意一个知识点:缓冲主要针对的是写操作,缓存主要针对的是读操作。

另一个复用优化的典型场景就是池化技术,比如:数据库连接池、线程池等。



计算优化

对于计算优化来说,我们可以从以下几个小的方面来阐述。

并行计算

不难理解,就是多个计算同时进行。这里,又可以将并行计算分为:多机并行计算、多进程并行计算和多线程并行计算。

多机并行计算: 将一个大的计算任务,拆分成N个小的计算任务,分发到不同的机器进行处理。典型的场景就是Hadoop的MapReduce极端。

多进程计算: 比如,Nginx采用的NIO模型,采用的是进程调度的策略,由Master进程调度Worker进程,Worker进行来处理具体的请求。

多线程计算: 对于多线程计算来说,也是我们平时接触最多的一种计算方式,我们可以使用多线程技术,将复杂的逻辑计算拆分成一个个小的计算任务,分发到不同的线程中去执行。

同步变异步

同步和异步的区别就是:同步需要等待返回结果,异步不需要等待返回结果。如果我们在业务程序中,不需要等待返回结果数据,则我们可以将同步调用优化为异步调用,从而提升我们系统的性能。

懒加载

最典型的场景就是Spring中的懒加载,只有第一次获取bean的时候,才会创建bean实例。



快速实现

对于快速实现来说,不仅包含我们需要利用相关的程序框架迅速开发出我们想要的业务,也需要我们在进行技术选型时,尽量使用一些性能优良的组件。比如,在进行网络开发时,尽量选择Netty,结合轻量级的数据传输,就不要使用WebService等技术了。

很多公司喜欢使用适配器模式,在一些现有的开源组件之上,再抽象一层自己的组件,这样就能够做到切换底层组件的时候,对上层应用无感。

好了,今天我们就到这儿吧,我是冰河,我们下期见!!



推荐阅读
  • 如何在mysqlshell命令中执行sql命令行本文介绍MySQL8.0shell子模块Util的两个导入特性importTableimport_table(JS和python版本 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • 什么是大数据lambda架构
    一、什么是Lambda架构Lambda架构由Storm的作者[NathanMarz]提出,根据维基百科的定义,Lambda架构的设计是为了在处理大规模数 ... [详细]
  • mapreduce源码分析总结
    这篇文章总结的非常到位,故而转之一MapReduce概述MapReduce是一个用于大规模数据处理的分布式计算模型,它最初是由Google工程师设计并实现的ÿ ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • OO第一单元自白:简单多项式导函数的设计与bug分析
    本文介绍了作者在学习OO的第一次作业中所遇到的问题及其解决方案。作者通过建立Multinomial和Monomial两个类来实现多项式和单项式,并通过append方法将单项式组合为多项式,并在此过程中合并同类项。作者还介绍了单项式和多项式的求导方法,并解释了如何利用正则表达式提取各个单项式并进行求导。同时,作者还对自己在输入合法性判断上的不足进行了bug分析,指出了自己在处理指数情况时出现的问题,并总结了被hack的原因。 ... [详细]
  • vb.net不用多线程如何同时运行两个过程?不用多线程?即使用多线程,也不会是“同时”执行,题主只要略懂一些计算机编译原理就能明白了。不用多线程更不可能让两个过程同步执行了。不过可 ... [详细]
  • 线程漫谈——线程基础
    本系列意在记录Windwos线程的相关知识点,包括线程基础、线程调度、线程同步、TLS、线程池等。进程与线程理解线程是至关重要的,每个进程至少有一个线程,进程是线程的容器,线程才是真正的执行体,线程必 ... [详细]
author-avatar
Zan吴磊Leo
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有