性能优化

2020面试必问之jvm与性能优化

我是研究僧i 提交于 2020-02-25 22:22:28
无论什么级别的Java从业者,JVM都是进阶时必须迈过的坎。不管是工作还是面试中,JVM都是必考题。如果不懂JVM的话,薪酬会非常吃亏(近70%的面试者挂在JVM上了)。 本文将重点介绍面试过程中常见的 JVM 题目。 1.描述一下JVM加载Class文件的原理机制? 在面试java工程师的时候,这道题经常被问到,故需特别注意。 什么是类加载器? 3.类加载器有哪些? 什么是tomcat类加载机制? 这个题给大家一个小提示 5、类加载器双亲委派模型机制? 6.Java内存分配 Java堆的结构是什么样子的? 简述各个版本内存区域的变化? 参考:https://blog.csdn.net/rainnnbow/article/details/50541079 说说各个区域的作用? Java 中会存在内存泄漏吗 ,简述一下? Java 类加载过程? 什么是GC?为什么要有GC? 简述一下Java垃圾回收机制? 如何判断一个对 象是否存活? 垃圾回收的优点和原理,并考虑2种回收机制?基本原理是什么? 深拷贝 和浅拷贝 ? 什么是分布式垃圾回收(DGC)?它是如何工作的? 在Java中,对象什么时候可以被垃圾回收? 19.简述Minor GC和Major GC? Java中垃圾收集的方法有哪些? 21.讲讲你理解的性能评价及测试指标? 22.常用的性能优化方式有哪些? 23

五大CSS性能优化工具让网站加载更快

点点圈 提交于 2020-02-25 19:09:40
为什么Web页面的加载速度如此重要?在这个信息化的时代,如果一个网站的加载时间过长,大部分用户会极其不耐烦地选择“关掉”!这让辛辛苦苦熬夜敲代码的程序员们情何以堪,不管网站功能如何强大,用户根本都没来得及看一眼,结果网站访问量越来越少,粉丝转化率越来越低,最后,程序员可能就要下岗了。 了解前端开发的程序员都知道,影响网站性能的因素有很多,例如,HTTP请求数量,臃肿的代码,繁重的媒体文件等。如何编写CSS以及如何在浏览器中加载样式表都会对加载时间造成重大影响,接下来推荐五款针对CSS的性能提升工具,以帮助广大前端开发程序员创建一流的网站。 TestMyCSS TestMyCSS是一款免费的在线优化工具,具有很多功能。它可用来检查代码冗余,验证错误,未使用的CSS和寻求最佳做法。程序员只需将网址输入网站的CSS文件,就可以立即开始使用,TestMyCSS可以发现需要改进的所有项目。不仅如此,程序员还可以看到一些有用的提示: 如何简化复杂的选择器 需要去掉的重复的CSS属性和选择器 代码中存在的重要声明的数量 不必要的类特异性 不必要的IE修复 不需要供应商前缀的CSS属性 具有标签名的类或ID规则,例如a.primary-link 通用选择器使用不当 Stylelint 新建一个前端学习qun438905713,在群里大多数都是零基础学习者,大家相互帮助,相互解答

性能优化小结

倖福魔咒の 提交于 2020-02-24 04:40:55
今年上半年公司的产品开发侧重点从开发新产品转向了性能优化和运营,因此需要我们针对性能优化这一块,制定一些计划。二月份已经进行了一些初步的实践,这里做一个小结,便于今后参考。 一、前端优化 1. 页面初始资源的加载 通过 YSLOW+PageSpeed 来进行前端性能检测,根据其给出的意见做出对应的调整。由于产品中前端页面都比较简单,目前这部分内容的评分基本符合要求。 2.JS 脚本执行效率 考虑到我们的产品大多为客户端内嵌网页,很多数据是从客户端异步获取的, JS 脚本也会受到这些数据请求时间的影响,且内嵌客户端网页不能通过 Firebug 之类的工具进行断点调试,目前的思路主要是自己写小工具,在 JS 代码中埋点,最后输出每个功能的执行时间,以此来定位性能问题触发点。 二、后端优化 1. 数据库优化 主要体现在数据库的查询操作上面,部分查询很慢。 发现: SQL 测试 解决:优化 SQL 语句或者采用高效的数据库操作工具或者进行读写分离 2.程序流程上的优化 随着需求的增加和调整,存在代码累积的问题,有时候会导致一个简单的业务中出现重复的流程。 发现: CodeReview 解决:代码重构 3.程序架构上的优化 一方面是随着项目的发展,用户量的增加,初期的程序设计不能满足现有的需求;另一方面是为了解决问题,在项目中使用了其他的框架技术,导致后期比较杂乱,难以部署维护。 发现

服务性能优化过程

浪尽此生 提交于 2020-02-22 15:11:23
背景 组内有好几个线上服务,除了业务逻辑不一样,请求处理过程基本上都是一致的。这些服务的执行逻辑都非常简单,但是有几个问题: 单机QPS很低,需要很多台机器 99分位耗时比理论上的长很多 在服务的负载达到上限时,服务器的负载却非常低 上面的这些问题在财大气粗的公司面前都不是问题啊,性能不够加机器! 性能不够加机器! 上游再一次过来反映超时问题时,为了壮年程序员的尊严,这次刚好有时间决定不再单纯的加机器,要把这个程序优化一下,用一次屠龙技。 技术栈: 语言:java 通信方式:thrift,server模式为THsHaServer redis客户端:jedis 模型:xgboost 执行环境:docker,8核 8G 缓存集群:通信协议为redis,但实现方式和redis不一样 优化后结果 优化过程 想要提升程序的性能,首先需要找到程序的瓶颈所在,然后有针对的去进行优化。 流程分析 优化前流程图 这个流程图省略了业务处理逻辑,只展示了各个线程之间的交互关系。构造redis请求的那部分逻辑,其实使用了两个forkjoin线程池,但它们两个的逻辑非常类似,为了简化把它们合并到一个流程中了。流程图中有两个深红色的步骤,很明显的看出两个明显能影响性能的地方。 结合服务的执行环境,可以总结出以下问题: 线程数过多 由于操作系统对线程的抢占式调度,线程频繁的上下文切换会带来几个问题:

SQLite 性能优化

こ雲淡風輕ζ 提交于 2020-02-22 04:37:58
SQLite性能优化 主要通过pragma指令来实现。 比如: 空间释放、磁盘同步、Cache大小等。 不要打开。前文提高了,Vacuum的效率非常低! PRAGMA auto_vacuum; PRAGMA auto_vacuum = 0 | 1; 查询或设置数据库的auto-vacuum标记。 正常情况下,当提交一个从数据库中删除数据的事务时,数据库文件不改变大小。未使用的文件页被标记并在以后的添加操作中 再次使用。这种情况下使用VACUUM命令释放删除得到的空间。 当开启auto-vacuum,当提交一个从数据库中删除数据的事务时,数据库文件自动收缩, (VACUUM命令在auto-vacuum开启的数据库中不起作用)。数据库会在内部存储一些信息以便支持这一功能,这使得 数据库文件比不开启该选项时稍微大一些。 只有在数据库中未建任何表时才能改变auto-vacuum标记。试图在已有表的情况下修改不会导致报错。 建议改为8000 PRAGMA cache_size; PRAGMA cache_size = Number-of-pages; 查询或修改SQLite一次存储在内存中的数据库文件页数。每页使用约1.5K内存,缺省的缓存大小是2000. 若需要使用改变大量多行的UPDATE或DELETE命令,并且不介意SQLite使用更多的内存的话,可以增大缓存以提高性能。

MySQL性能优化---定位慢查询

好久不见. 提交于 2020-02-19 19:03:46
1.什么是慢查询   mysql记录下查询超过指定时间的语句,被称为“慢查询”; 2.启动慢查询日志   1.查询是否把索引的SQL记录到慢查询日志中    SHOW VARIABLES LIKE 'log_queries_%'   2.将查询到的值若为OFF,表示没有记录,就开启记录 SET GLOBAL log_queries_not_using_indexes=ON;       3.查看慢查询时间long_query_time, SHOW VARIABLES LIKE 'long_query_time';     默认慢查询的时间就是10s   4.将慢查询时间修改成0.9 SET GLOBAL long_query_time=0.9;   5.查看是否开启慢查询日志 SHOW VARIABLES LIKE 'slow_query_log';   6.如果值为OFF,表示没有开启,就将其设置为ON启动 SET GLOBAL slow_query_log=ON;   7.查看慢查询日志记录的位置 SHOW VARIABLES LIKE 'slow_query_log_file';   8.如果想修改慢查询日志记录的位置,如下 SET GLOBAL slow_query_log_file='E:\\mysqlerror.log' 3.模拟慢查询   1.创建表   /*部门表*

sqlite 性能优化

青春壹個敷衍的年華 提交于 2020-02-18 18:08:07
主要通过pragma指令来实现。 比如: 空间释放、磁盘同步、Cache大小等。 不要打开。前文提高了,Vacuum的效率非常低! PRAGMA auto_vacuum; PRAGMA auto_vacuum = 0 | 1; 查询或设置数据库的auto-vacuum标记。 正常情况下,当提交一个从数据库中删除数据的事务时,数据库文件不改变大小。未使用的文件页被标记并在以后的添加操作中 再次使用。这种情况下使用VACUUM命令释放删除得到的空间。 当开启auto-vacuum,当提交一个从数据库中删除数据的事务时,数据库文件自动收缩, (VACUUM命令在auto-vacuum开启的数据库中不起作用)。数据库会在内部存储一些信息以便支持这一功能,这使得 数据库文件比不开启该选项时稍微大一些。 只有在数据库中未建任何表时才能改变auto-vacuum标记。试图在已有表的情况下修改不会导致报错。 建议改为8000 PRAGMA cache_size; PRAGMA cache_size = Number-of-pages; 查询或修改SQLite一次存储在内存中的数据库文件页数。每页使用约1.5K内存,缺省的缓存大小是2000. 若需要使用改变大量多行的UPDATE或DELETE命令,并且不介意SQLite使用更多的内存的话,可以增大缓存以提高性能。 当使用cache_size

性能优化--CPU使用率

允我心安 提交于 2020-02-18 05:25:15
usr 用户态CPU时间 nice 低优先级用户态CPU时间 system 系统态CPU时间 idle 空闲时间 iowait 等待IO的时间 irq 硬中断的时间 softirq 软中断的时间 steal 当系统运行在虚拟机中时,被其他CPU占用的时间。 gust 通过虚拟化,运行其他操作系统的时间。 gust_nice 以低优先级运行虚拟化的时候。 CPU使用率 = 1- 空闲时间/CPU总时间 用户态占用过多的CPU,应着重排查用户进程的性能问题。 系统态占用过多的CPU,应着重排查系统调用,内核进程的问题。 IO等待时机过长,应着重排查系统存储的IO问题。 软中断硬中断,应着重排查内核中的中断服务程序。 top,perf top -g 进程号 必须加-g才能显示函数调用信息。看exectue_ex下的函数调用。 碰到CPU占用率过高,但是top看不到CPU占用高的进程的情况可能是: 1、进程不断因为某种原因(段错误等)退出之后,被监视进程不断重启。 2、在进程内部通过exec调用的外部命令。这些命令进程只运行很短的时间就退出,一般很难用top来监控。 用工具 https://github.com/brendangregg/perf-tools/blob/master/execsnoop 可以监视出存在时间很短的进程。 也可以用perf record -g观察15秒

性能优化-CPU上下文

泄露秘密 提交于 2020-02-17 19:10:27
CPU上下文:CPU中的寄存器和程序计数器。切换出的CPU上下文,会保存到linux系统内核中。 分为3种:1、进程上下文,2、线程上下文,3、中断上下文(硬件通过触发信号,导致中断处理程序运行)。 进程的运行空间:内核空间、用户空间。 内核空间:具有最高权限,可以直接访问所以资源,包括硬件。 用户空间:只有有限资源,不能访问包括内存在内的硬件只有,必须通过系统调用嵌入到内核中,才可以调用这些资源。 从用户态到内核态,是通过系统调用实现的。比如我们要查看一个文件的内容,需要 1、调用系统调用open打开一个磁盘文件, 2、read读取一个文件内容, 3、write输入到标准输入, 4、close关闭文件。 一、 执行系统调用,也是需要切换CPU上下文的。需要先保存CPU上下文的当前状态,然后加载系统调用的上下文,再然后跳转到内核态,执行内核任务。 系统调用完成,需要保存CPU现在的上下文状态,加载上次新的上下文状态,进入用户态,执行。 一次系统调用,发生了2次CPU上下文切换。 系统调用,一直是在同一个进程中运行的。 二、 进程上下文切换 进程切换只能在内核态中运行。进程切换不只切换虚拟内存、栈、全局变量等用户空间资源,也包括内核堆栈、等内核态资源。 保存上下文和恢复上下文,也不是免费操作,需要内核占用CPU运行,进行切换。 如果进程切换太频繁

数据库性能优化

我是研究僧i 提交于 2020-02-16 07:26:30
数据库设计   实现sql server数据库的优化,首先要有一个好的数据库设计方案。在实际工作中,许多sql server方案往往是由于数据库设计得不好导致性能很差。实现良好的数据库设计必须考虑这些问题:   1. 逻辑数据库规范化问题    一般来说,逻辑数据库设计会满足规范化的前3级标准:    第1规范:没有重复的组或多值的列;    第2规范: 每个非关键字段必须依赖于主关键字,不能依赖于一个组合式主关键字的某些组成部分;    第3规范: 一个非关键字段不能依赖于另一个非关键字段。    遵守这些规则的数据库设计会产生较少的列和更多的表,因而也就减少了数据冗余,也减少了用于存储数据的页。   2. 生成物理数据库    要想正确选择基本物理实现策略,必须了解和利用好数据库访问格式和硬件资源的操作特点,特别是内存和磁盘子系统i/o。以下是一些常用技巧:    与每个表列相关的数据类型应该反映数据所需的最小存储空间,特别是对于被索引的列更是如此。比如能使用smallint类型就不要用integer类型,这样索引字段可以被更快地读取,而且可以在一个数据页上放置更多的数据行,因而也就减少了i/o操作。    把一个表放在某个物理设备上,再通过sql server的段把它的不分簇索引放在一个不同的物理设备上,这样能提高性能