总结篇:大型网站技术架构-性能(二)

来源:互联网 发布:淘宝上网络解锁可靠吗 编辑:程序博客网 时间:2024/05/20 01:11

前言:上次我说到缓存这块的东西,不过由于最近工作时间忙,项目催时间,出现了一些奇葩的问题,个人QQ空间都有记录每次遇到问题的解决方法,这就是经验吧,接着上面的来!

缓存预热

  1. 这个解释简单点,就是把常用的一些元数据,比如城市地名、类目等等,这些数据可以在启动时加载数据库中的全部数据到缓存中进行预热,(把一些常用的数据提前加载好)。

分布式缓存架构

  1. 首先说明下什么是分布式缓存,分布式缓存指缓存部署在多个服务器组成的集群中,以集群的方式提供缓存服务,它的架构方式有两种,第一是:JBoss Cache为代表的需要更新同步的分布式缓存,另一个也是我用的最多的,Memcached为代表的不互相通信的分布式缓存。我主要说下Memcached哦,毕竟我这个是用的最多的。

Memcached

  1. 首先它是使用的TCP协议通信,只要支持该协议的客户端都可以和Memcached服务器通信,(TCP协议后面要了解下,这个基本没怎么看过,哈哈),Memcached服务端通信模块基于Libevent(这玩意我也不知道是啥,等我后面有时间在研究哈,不过太深奥的它估计就看看吧,毕竟我还是以JAVA为主,后面会写点基础的东西)。Memcached是固定分配空间的,它的原理要画个图来说下,文字先说下,就是一个大空间看成N个小空间B 然后N个小空间B有包含N个小小空间C ,然后这个小小空间C大小是固定的,而相同空间大小的小小空间C又被组在一起看成一个,slab_class,然后每次放数据的时候是放在最小的slab_calss里面的,然后就没了。

代码优化

  1. 多线程的使用有助于提高任务并发度,提高系统吞吐能力,改善系统性能,但是使用多线程需要注意的问题就是线程安全问题,(就是N个线程并发对一个数据修改,导致数据混乱)。当然这是有解决的方法的。
    1. 将对象设计为无状态对象 (对象本身不存储状态信息)
    2. 使用局部对象
    3. 并发访问资源时使用锁、或者缓存 (别弄成死锁了啊)

资源复用

  1. 减少开销很大的系统资源的创建和销毁,资源复用的主要两种模式是:单例和对象池

垃圾回收

  1. 这个也是蛮重要的,为什么呢,因为理解垃圾回收机制有助于程序优化和参数调优,和编写内存安全的代码啊。就拿JVM来说,它的内存主要划分为,堆和堆栈,堆栈用于存储线程上下文信息;堆是存储对象的内存空间,对象的创建和释放、垃圾回收就在这里进行的哦,通过对对象生命周期的观察,发现大部分对象的生命周期都很短,然后这部分对象产生的垃圾应该被更快的收集,然后释放内存,这就是JVM分代垃圾回收,当然搞java的必须对JVM很了解,所以这个也是后面的任务之一啊,额,继续吧,在JVM分代垃圾回收机制中,将应用程序可用的堆空间分为 年轻代和老年代,年轻代有分为Eden区、Form区和To区,新的对象总是在Eden区被创建,然后Eden区空间满了,就触发一次年轻代的垃圾回收,将还被使用的对象复制到Form区,这样Eden未被使用的空间又可以继续创建对象咯,当Eden区再用完的时候会再次触发年轻代垃圾回收,把Eden区和Form区还在被使用的对象复制到To区,再然后多次触发年轻代垃圾回收,对象会在Form区和To区多次复制,要是超过某个阀值对象还没有被释放,就将该对象复制到老年区,要是老年区的空间也用完了,就会触发Full GC(全量回收),而全量回收会对系统的性能产生很大影响,所以要尽量的减少Full GC 。(这个后面在看看这本书)
    《实战Java虚拟机:JVM故障诊断与性能优化》
存储性能优化 (这个就不说了,毕竟我现在确实看不懂这个)
0 0
原创粉丝点击