oscache

Java优化性能

☆樱花仙子☆ 提交于 2021-02-12 12:00:36
尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 第一,控制资源的使用,通过线程同步来控制资源的并发访问; 第二,控制实例的产生,以达到节约资源的目的; 第三,控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。 2、尽量避免随意使用静态变量 当某个对象被定义为static变量所引用,那么GC通常是不会回收这个对象所占有的内存,如 3、尽量避免过多过常地创建Java对象 尽量避免在经常调用的方法,循环中new对象,由于系统不仅要花费时间来创建对象,而且还要花时间对这些对象进行垃圾回收和处理,在我们可以控制的范围内,最大限度地重用对象,最好能用基本的数据类型或数组来替代对象。 4、尽量使用final修饰符 带有final修饰符的类是不可派生的。在JAVA核心API中,有许多应用final的例子,例如java、lang、String,为String类指定final防止了使用者覆盖length()方法。另外,如果一个类是final的,则该类所有方法都是final的。java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关),此举能够使性能平均提高50%。 5、尽量使用局部变量

MySQL 基础知识梳理学习(七)----sync_binlog

怎甘沉沦 提交于 2021-01-23 06:47:59
一般在生产环境中,很少用MySQL单实例来支撑业务,大部分的MySQL应用都是采用搭建集群的方法。搭建MySQL集群,可以进行数据库层面的读写分离、负载均衡或数据备份。基于MySQL原生的Replication是最常见的保证数据库安全的机制,满足数据库的高可用,在数据库发生宕机的情况后,其他节点还能快速提供服务,并且数据库的数据不丢失。 Binlog是用来保存数据库修改的日志信息。一般的主从复制都是基于Binlog的,Binlog的安全直接关系到主从复制的安全,而Binlog的写入方式主要由参数sync_binlog来控制。参数取值主要如下: 参数取值 影响的行为 sync_binlog=0 事务提交时,MySQL将Binlog信息写入到Binlog文件(OS Cache)中,但是MySQL不控制Binlog的刷盘操作,由文件系统自己控制其缓存的刷新。缺点是,一旦操作系统宕机,在Binlog cache中的所有Binlog都会丢失。如果只是数据库宕机,而操作系统不宕机,那么数据库所生成的Binlog都不会丢失。 sync_binlog=1 每一个事务提交时,MySQL都会把Binlog刷新到磁盘中,这样,数据库的安全性最高。缺点是,性能损耗是最大的。此设置可以保证,在数据库或者操作系统宕机的情况下,二进制日志中缺少的任何事务也只能处于准备阶段,那么导致服务器自动恢复时

Kafka的生产者原理及重要参数说明

浪尽此生 提交于 2021-01-21 12:59:11
上一篇 说了一个案例是为了说明如何去考量一个Kafka集群的部署,算是一个参考吧,毕竟大家在不同的公司工作肯定也会有自己的一套实施方案。 这次我们再回到原理性的问题,这次会延续 第一篇 的风格,带领大家把图一步一步画出来。 Kafka的Producer原理 首先我们得先有个集群吧,然后集群中有若干台服务器,每个服务器我们管它叫Broker,其实就是一个个Kafka进程。 如果大家还记得 第一篇 的内容,就不难猜出来,接下来肯定会有一个controller和多个follower,还有个ZooKeeper集群,一开始我们的Broker都会注册到我们的ZooKeeper集群上面。 然后controller也会监听ZooKeeper集群的变化,在集群产生变化时更改自己的元数据信息。并且follower也会去它们的老大controller那里去同步元数据信息,所以一个Kafka集群中所有服务器上的元数据信息都是一致的。 上述准备完成后,我们正式开始我们生产者的内容。 名词1——ProducerRecord 生产者需要往集群发送消息前,要先把每一条消息封装成ProducerRecord对象,这是生产者内部完成的。之后会经历一个序列化的过程。之前好几篇专栏也是有提到过了,需要经过网络传输的数据都是二进制的一些字节数据,需要进行序列化才能传输。 此时就会有一个问题

你不知道的,Java代码性能优化的 40+ 细节,赶快收藏!

余生颓废 提交于 2021-01-15 01:42:26
在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身。养成良好的编码习惯非常重要,能够显著地提升程序性能。 在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 控制资源的使用,通过线程同步来控制资源的并发访问; 控制实例的产生,以达到节约资源的目的; 控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。 整理了一份Java面试宝典完整版PDF 避免随意使用静态变量 当某个对象被定义为static变量所引用,那么GC通常是不会回收这个对象所占有的内存,如 public class A { private static B b = new B(); } 此时静态变量b的生命周期与A类同步,如果A类不会卸载,那么b对象会常驻内存,直到程序终止。 避免过多过常地创建Java对象 尽量避免在经常调用的方法,循环中new对象,由于系统不仅要花费时间来创建对象,而且还要花时间对这些对象进行垃圾回收和处理,在我们可以控制的范围内,最大限度地重用对象,最好能用基本的数据类型或数组来替代对象。 使用final修饰符 带有final修饰符的类是不可派生的。在JAVA核心API中,有许多应用final的例子,例如java、lang、String

day64_SpringMVC学习笔记_02

若如初见. 提交于 2021-01-09 17:11:24
1、springmvc对多视图的支持 (1)导入xml格式视图支持的jar包    注意 :springmvc本身就支持xml格式,所以不用导入其他支持的jar包了。 (2)在springmvc.xml中配置支持多视图 <!-- 配置支持多视图 --> < bean class = "org.springframework.web.servlet.view.ContentNegotiatingViewResolver" > <!-- 配置支持的媒体类型 --> <!-- spring3.2后改成如下配置 --> < property name = "contentNegotiationManager" > < bean class = "org.springframework.web.accept.ContentNegotiationManagerFactoryBean" > <!-- 指定多个媒体类型 --> < property name = "mediaTypes" > < map > < entry key = "json" value = "application/json" > </ entry > < entry key = "xml" value = "application/xml" > </ entry > <!-- <entry key="pdf" value

51 精益求精:深入研究一下Broker是如何持久化存储消息的?

五迷三道 提交于 2021-01-01 11:07:46
目录 1、为什么Broker数据存储是最重要的一个环节? 2、CommitLog消息顺序写入机制 3、MessageQueue在数据存储中是体现在哪里呢? 4、如何让消息写入CommitLog文件近乎内存写性能的? 5、同步刷盘与异步刷盘 6、对今天内容的一点小小总结 1、为什么Broker数据存储是最重要的一个环节? 上次给大家分享完Producer的工作原理之后,团队整体都对RocketMQ的数据分片机制以及发送消息的时候如何写入各个Broker 机器有了一定的了解。接着小猛就开始来给大家分享最为重要的Broker数据存储的环节。 首先我们得明确一点,为什么Broker数据存储是最重要的一个环节? 很简单,实际上类似RocketMQ、Kafka、RabbitMQ的消息中间件系统,他们不只是让你写入消息和获取消息那么简单,他们本身最 重要的就是提供强大的数据存储能力,可以把亿万级的海量消息存储在自己的服务器的磁盘上。 这样的话,各种不同的系统从MQ中消费消息的时候,才可以从MQ服务器的磁盘中读取到自己需要的消息。 否则如果MQ不在机器磁盘上存储大量的消息,如果消息都放在自己的内存里,一个是内存很可能放不下,另外一个是可能你机器重 启,内存里的消息就会全部丢失了。 所以大家首先要明确一点,Broker数据存储实际上才是一个MQ最核心的环节,他决定了生产者消息写入的吞吐量

大型网站性能提升

自闭症网瘾萝莉.ら 提交于 2020-12-18 08:58:34
什么是性能 有人说性能就是访问速度快慢,这是最直观的说法,也是用户的真实体验。一个用户从输入网址到按下回车键,看到网页的快慢,这就是性能。对于我们来说,需要去挖掘这个过程,因为这决定我们怎么去做性能优化。 这中间发生了什么? 用户访问网站的整个流程:用户输入网站域名,通过DNS解析,找到目标服务器IP,请求数据经互联网达到目标服务器,目标服务器收到请求数据,进行处理(执行程序、访问数据库、文件服务器等)。处理完成,将响应数据又经互联网返回给用户浏览器,浏览器得到结果进行计算渲染显示给用户。 我们把整个过程,分为三段路径: 1、第一段在用户和浏览器端,主要负责发出用户请求,以及接受响应数据进行计算渲染显示给用户; 2、第二段在网络上,负责对请求数据、响应数据的传输; 3、第三段在网站服务器端,负责对请求数据进行处理(执行程序、访问数据库、文件等),并将结果返回; 第一路径 第一路径花费的时间包括输入域名发起请求的时间和浏览器收到响应后计算渲染的时间。 输入域名发起请求,实质过程是: 1、用户在浏览器输入要访问的网站域名; 2、本地DNS请求网站授权的DNS服务器对域名进行解析,并得到解析结果即IP地址(并将IP地址缓存起来)。 3、向目标IP地址发出请求。 从这个过程我们可以看到,优化的地方主要是减少DNS解析次数,而如果用户浏览器设置了缓存

mysql 一次数据更新过程(undo redo binlog 内存缓冲池扮演了什么角色)

筅森魡賤 提交于 2020-10-23 19:41:58
介绍 本篇博文是自己学习 儒猿技术窝) ​​​​​中:《从零开始带你成为MySQL实战优化高手》专栏课程,进行的总结,因为老师写的很好,所以很大一部分直接拿过来使用。 如果想学习完整的知识,请支持正版,地址: 从零开始带你称为MySQL实战优化高手(儒猿技术窝) 本文主要讲解了一次数据更新在mysql中经历了哪些过程。 先直接看下我们会讲到哪些步骤,文章中 主要有以下9个步骤: (1)更新语句经过 解析,优化 生成执行计划,交由执行器调用存储引擎接口(注:执行器会多次调用存储引擎接口,并不是一次完成) (2)查询旧值,先去内存缓冲区查看是否有数据,如果没有,从磁盘中加载到内存,并将旧值写入到 Undo log 日志中,用于回滚数据 (3)更新内存中的数据(注:磁盘仍为旧数据) (4)将操作写入到Redo Log 中 (5)Redo Log根据刷盘策略刷到磁盘 (6)准备提交事务,写入binlog 日志(注:binlog也有自己的刷盘策略) (7)把本次更新对应的binlog文件名称和这次 更新的binlog日志在文件里的位置,都写入到redo log日志文件里去,同时在redo log日志文件里写入一个commit标 记。 (8)事务完成 (9)mysql会有个后台线程将内存数据刷入到磁盘 整体的流程图如下: 更新语句 首先假设我们有一条SQL语句是这样的: update

从零到壹搭建大规模应用技术架构演进-蛙课网

限于喜欢 提交于 2020-08-15 12:49:46
从零搭建 > 刚开始的时候,也就是创业初期或网站/产品初期,业务功能比较少,访问量也不大,通过就是采用经典的MVC架构,采用单体应用的模式进行开发,然后发布到Tomcat容器中运行,这时候我们的文件,数据库,应用都在一个服务器上,没有缓存,不追求性能优化与网站架构。 服务分离 > 随着业务的发展,系统功能的增多,访问用户量的增加,显然采用单台服务器已无法满足系统的负载,这时候,我们就需要提前采取相应的措施,应对访问流量的增加。由于我们是单体架构,优化架构在短时间内是不现实的,增加机器是一个不错的选择。这时候,我们可以把应用和数据库服务分开单独部署,如果有条件也可以把文件服务器单独部署。 集群部署 > 为了提升服务处理能力,我们通常会将Tomcat容器进行集群部署,集群主要分为三大类( 高可用集群, 负载均衡集群,科学计算集群)。我们最生产中最常见的就是负载均衡集群。 负载均衡 > 集群部署之后,我们不能让用户通过两个入口访问我们的服务,而是统一访问入口,此时我们可以在Tomcat容器前加一个负载均衡代理服务器,业界比较流行的是采用Nginx,当然使用apache也未尝不可。 用户的请求发送给Nginx反向代理服务器,然后反向代理把请求转发到后端的应用服务器。 严格意义上来说,Nginx是属于web服务器,一般用于处理静态html、css、js请求,而Tomcat属于web容器

redis 的持久化机制

我的梦境 提交于 2020-08-14 20:10:19
redis 持久化机制有两种:RDB 和 AOF。 RDB RDB 机制是对 redis 中的数据执行周期性的持久化。每个几分钟、几小时、几天生成 redis 内存中的数据的一份完整的快照。 AOF 每条写入命令作为日志,写入 aof 文件中。现代操作系统中,写入文件不是直接写磁盘,会先写到 os cache,然后到一定时间再从 os cache 到磁盘文件。每隔 1 秒调用一次操作系统的 fsync 操作,强制将 os cache 中的数据,刷入磁盘文件中。 为了保证性能,会先写入 os cache 中,然后定期强制执行 fsync 操作将数据刷入磁盘。 原理: 每台单机 redis 的数据量收到内存限制,所以 aof 不会无线增长; 当数据超过内存限制的时候,会自动使用 LRU 算法将数据淘汰掉; AOF 存放的是每条写入的命令,所以会不断的膨胀,当达到一定的时候,会做 rewrite 操作; rewrite 操作:基于当时 redis 的内存中的数据,重新构造一个更小的 aof 文件,然后删除旧的 aof 文件。 总结:aof 被不断的追加,内存中的数据有最大限制,会被自动淘汰,当 aof 中的数据大于内存中数据时,就会执行 rewrite 操作,生成新的 aof 文件。 AOF 机制对每一条写入命令作为日志,以 append-only 的模式写入一个日志文件中,在