java分布式学习笔记
1.分布式JAVA应用
基于TCP/IP+BIO,TCP/IP+NIO,UDP/IP +BIO,UDP/IP+NIO 实现消息方式的系统间的通信方式
基于MINA,JETTY框架
基于远程调用 RMI(spring rmi),WebService(CXF)
2.大型分布式java应用与SOA
基于SCA实现SOA平台
基于ESB实现SOA平台
ESB核心思想是基于消息中间件来实现系统间的交互
基于Tuscany实现SOA平台--SCA
基于Mule实现SOA平台 --ESB
3.深入理解JVM
Java源码编译步骤 1.分析和输入到符号表 2.注解处理 3.语义分析和生成class文件
类加载机制 1.装载(二进制字节码加载至JVM) 2.链接(负责对二进制字节码的格式进行校验,初始化装载类中静态变量及解析类中调用的接口,类)
3.初始化(执行类中的静态初始化代码,构造器代码及静态属性的初始化)
JDK基于栈的体系结构来执行字节码,基于栈方式是好处为代码紧凑,体积小.
编译时提供两种模式:client compiler 和 server compiler
client compiler 是轻量级,只做少量性能开销比高的优化,它占用内存较少,适用于桌面交互式应用。优化主要有:方法内联,去虚拟化,冗余削除。
server compiler 是重量级,采用了大量的传统编译优化技巧来进行优化,占用内存相对会多一些,适用于服务器的应用。
堆用于存储对象及数组值。
-XMS -XMX 设置一样的大小,防止内存大于变化。
jstat -gcutil [pid] 1000 10 minor GC时的变化情况
jconsole 可以图形查看JVM内存变化状况
JVisualVM 它类似于JPofiler 工具,基于此工具可查看内存的消耗情况,线程的执行状况及程序中消耗CPU,内存的动作。
JMap 分析JVM内存状况的工具 jmap -heap [pid] --查看JVM堆的配置信息
jmap -histo [pid] 查看JVM堆中对象详细占用情况
jHat 是java自带的一个用于分析jvm堆dump文件工具 jhat -J-Xmx1024 [file]
jStat JAVA自带的一个统计分析JVM运行状况的工具
Eclipse Memory Analyzer 分析jvm 堆dump文件的插件
TDA是开源界一个不错的用于分析线程堆栈信息的图形化工具
5。性能调优
调用步骤:衡量系统现状 设定调优目标 寻找性能瓶颈 性能调优 衡量是否达到目标 性能调优
通常性能瓶颈在表象是资源消耗过多,外部处理系统性能不足,或得资源消耗不多
资源主要消耗在CPU,文件IO,网络IO以级内存方法,机器的资源是有限的。当某些资源消耗过多时,通常会造成系统的响应速度慢。
分析CPU 上下文切换, 运行队列 ,利用率
top 或 pidstat 方式来查看进程中线程的CPU的消耗状况
us 过高时,表示运行的应用消耗了大部分的CPU,sy值高时,表示Linux 花费了更多时间在进行线程的切换。
pidstat -d -t -p [pid] 1 100 查看线程IO消耗情况
iostat查看各个设备的IO历史状况
Linux 中可采用sar 来分析网络IO 的消耗状况
vmstat 查看内存信息
JVM调优
1.避免新生代大小设置过小 -当新生代大小设置过小时,会产生两种比较明显的现象,一是minor GC次数更加频繁,二是有可能导致minor gc对象直接进入旧生代。
2.避免新生代设置过大
3.避免Survivor区过小或过大
4.合理设置新生代存活周期
程序调优
1.us过高 增加 Thread.sleep
2.sy 过高 基于kilim 采用Coroution方式支撑高并发
最耗CPU的线程26697为例,将26697换算成十六进制的值,结合java thread dump (jstack [pid] | grmp 'nid = 0x6849') 找到些线程
文件IO消耗严重解决方法
1.异步写文件 log4j AsyncAppender
2.批量写文件
3.限流
4.限文件大小
网络IO消耗严重的解决方法
1.释放不必要的引用
2.使用对象缓存池
3.采用合理的缓存失效算法
4.合理使用SoftReference 和 WearReference
销竞争激烈
1.使用并发包中的类
2.使用Treiber 算法
3.使用michael-scott非阻塞队列算法
4.尽可能少用锁
5.拆分锁
6.去除读写操作的互斥锁
6。构建高可用的系统
负载均均衡技术
选择实际业务处理机器方式 1.随机选择 2.Hash选择 3.(Round-Robin)选择 4.按权重选择 5.按负载选择 6.按连接选择
响应返回方式 1.响应通过负载均衡机器返回(NAT) 2.响应直接返回请求发起方(IP Tunneling 或 DR)
硬件负载设备 F5 各 Netscalar
软件负载 LVS
去中心实现负载均衡 Gossip(Cassandra 采用)
基于Paxos保存一致性
Fackbook Scribe 日志分析系统
书推荐 web容量规划的艺术
7.构建可伸缩的系统
分布式文件系统 HDFS GFS
DAL(数据库访问层)--- amoeba
支撑大数据量 读写分离 多master