JVM 性能监控与调优篇-1-调优概述
调优概述背景说明
生产环境中的问题
生产环境发生了内存溢出该如何处理
生产环境应该给服务器分配多少内存合适
如何对垃圾回收器的性能进行调优
生产环境CPU负载飙高该如何处理
生产环境应该给应用分配多少线程合适
不加log,如何确定请求是否执行了某一行代码
不加log,如何实时查看某个方法的入参与返回值
WHY 调优
防止OOM
解决OOM
减少Full GC出现频率
监控依据
运行日志
异常堆栈
GC日志
线程快照
堆转储快照
调优方向
合理编写代码
充分合理使用硬件资源
合理进行JVM调优
性能优化步骤性能监控(发现问题)它是一种以非强行或者入侵方式收集或查看应用运营性能数据的活动
监控通常是指一种在生产、质量评估或者开发环境下实施的带有预防或主动性的活动。当应用相关干系人提出性能问题却没有提供足够多的线索时,首先我们需要进行性能监控,随后是性能分析。
GC 频繁
CPU LOAD过高
OOM
内存泄漏
死锁
程序响应时间较长
性能分析(排查问题)它是一种以侵入方式收集运行性能数据的活动,它会影响应用的吞吐量或响应性。性能分析是针对性能问题的答复结果,关注 ...
JVM 字节码与类的加载篇-4-类加载器
概述ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载,ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部,转换为一个与目标类对应的java.lang.Class对象实例。然后交给Java虚拟机进行链接、初始化等操作。因此ClassLoader在整个装载阶段,只能影响到类的加载,而无法通过ClassLoader去改变类的链接和初始化行为。至于它是否可以运行,则由Execution Engine决定。
类加载分类class文件的显式加载与隐式加载的方式是指JVM加载class文件到内存的方式
显式加载指的是在代码中通过调用ClassLoader加载class对象,如直接使用class.forName(name)或this.getclass().getclassLoader().loadclass()加载class对象。
隐式加载则是不直接在代码中调用ClassLoader的方法加载class对象,而是通过虚拟机自动加载到内存中,如在加载某个类的class文件时,该类的class文件中引用另外一个类的对象,此 ...
JVM 字节码与类的加载篇-3-类的加载过程
概述Java数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载
从class文件到加载到内存中的类,到类卸载出内存为止,它的整个生命周期包括如下7个阶段:
从类的使用过程来看:
Loading加载完成的操作
加载
所谓是将Java类的字节码文件加载到机器内存中,并在内存中构建出Java类的原型(类模板对象)。
类模板对象是Java类在JVM内存中的一个快照,JVM将从字节码文件中解析出的常量池、类字段、类方法等信息存储到类模板中,这样JVM在运行期便能通过类模板而获取Java类中的任意信息,能够对Java类的成员变量进行遍历,能进行Java方法的调用。
反射的机制即基于这一基础,如果JVM没有将Java类的声明信息存储起来,则JVM在运行期也无法反射。
加载完成的操作
通过类的全名,获取类的二进制数据流
解析类的二进制数据流为方法区内的数据结构(Java类模型)
创建java.lang.Class类的实例,表示该类型。作为方法区这个类的各种数据的访问入口
二进制流的获取方式
虚拟析可能通过文件系统读入.class ...
MySQL高级篇-19-数据库备份与恢复
物理备份与逻辑备份
物理备份:
备份数据文件,转储数据库物理文件到某一目录。物理备份恢复速度比较快,但占用空间比 较大,MySQL中可以用xtrabackup工具来进行物理备份
逻辑备份:
对数据库对象利用工具进行导出工作,汇总入备份文件内。逻辑备份恢复速度慢,但占用空 间小,更灵活。MySQL 中常用的逻辑备份工具为mysqldump。逻辑备份是备份sql语句,在恢复时执行备份的sql语句实现数据库数据的重现。
mysqldump 实现逻辑备份备份单个数据mysqldump命令执行时,可以将数据库备份成文本文件,该文件中实际上包含多个CREATE和INSERT语句,使用这些语句可以重新创建表和插入数据。
查出需要备份的表的结构,在文本文件中生成一个CREATE语句
将表中的所有记录转换成一条INSERT语句
1mysqldump –u 用户名称 –h 主机名称 –p密码 待备份的数据库名称[tbname, [tbname...]]> 备份文件名称.sql
备份全部数据库 若想用mysqldump备份整个实例,可以使用--all-databases或-A参数:
1 ...
MySQL高级篇-18-主从复制
主从复制概述提升数据库并发能力实际工作中常将Redis作为缓存与MysSQL 配合来使用,有请求时首先会从缓存中进行查找,如果存在就直接取出。如果不存在再访问数据库,这样提升读取效率,减少后端数据库访问压力,Redis的缓存架构是高并发架构中非常重要的一环。
一般应用对数据库而言都是读多写少,对数据库读取数据的压力比较大。采用数据库集群的方案,做主从架构 、进行读写分离,同样可以提升数据库的并发处理能力,但并不是所有的应用都需要对数据库进行主从架构设置,毕竟设置架构本身是有成本的
如果目的在于提升数据库高并发访问效率,首先考虑如何优化SQL和索引,其次才是采用缓存的策略,比如使用 Redis将热点数据保存在内存数据库中,从而提升读取的效 率;最后才是对数据库采用主从架构,进行读写分离。
主从复制作用
读写分离
可以通过主从复制的方式来同步数据,然后通过读写分离提高数据库并发处理能力
写库,Master主库:负责写入数据
读库,Slave从库:负责读取数据
当主库进行更新时会自动将数据复制到从库中,而在客户端读取数据时会从从库中进行读取
面对读多写少的需求,采用读写分 ...
MySQL高级篇-17-其他数据库日志
MySQL支持的日志日志类型MySQL有不同类型的日志文件,用来存储不同类型的日志,分为二进制日志、 错误日志 、通用查询日志和慢查询日志。MySQL 8.0 又新增两种支持的日志:中继日志和数据定义语句日志,使 用这些日志文件,可以查看MySQL内部发生的事情。
日志类型
说明
慢查询日志
记录所有执行时间超过long_query_time的所有查询,方便对查询进行优化
通用查询日志
记录所有连接的起始时间和终止时间,以及连接发送给数据库服务器的所有指令, 对复原操作的实际场景、发现问题,甚至是对数据库操作的审计都有很大的帮助。
错误日志
记录MySQL服务的启动、运行或停止MySQL服务时出现的问题,方便我们了解服务器的 状态,从而对服务器进行维护。
二进制日志
记录所有更改数据的语句,可以用于主从服务器之间的数据同步,以及服务器遇到故 障时数据的无损失恢复
中继日志
用于主从服务器架构中,从服务器用来存放主服务器二进制日志内容的一个中间文件。 从服务器通过读取中继日志的内容,来同步主服务器上的操作。
数据定义语句日志
记录数据定义语句执行的元 ...