《Java程序性能优化 让你的Java程序更快、更稳定》阅读笔记

来源:互联网 发布:heces水利预算软件 编辑:程序博客网 时间:2024/04/28 00:33

一.Linux中常用的监控CPU整体性能的工具有:

§ mpstat: mpstat 不但能查看所有CPU的平均信息,还能查看指定CPU的信息。

               mpstat [-P {|ALL}] [internal [count]]  -P {|ALL} 表示监控哪个CPU, cpu在[0,cpu个数-1]中取值

§ vmstat:只能查看所有CPU的平均信息;查看cpu队列信息; 

               vmstat和sar类似也可指定采样周期和采样数量

§ iostat: 只能查看所有CPU的平均信息,快速定位系统是否产生大量I/O操作

§ sar: 与mpstat 一样,不但能查看CPU的平均信息,还能查看指定CPU的信息。

           sar [-u,-r,-b] [<interval> <count>]  -u cpu利用率,-r内存利用率,-b I/O利用率,interval表示采样周期,count表示采样数量

§ top:显示的信息同ps接近,但是top可以了解到CPU消耗,可以根据用户指定的时间来更新显示。    


pidstat  linux性能检测工具

      在Debian/Ubuntu系统中可以使用下面的命令来安装

  # apt-get install sysstat

  CentOS/Fedora/RHEL版本的linux中则使用下面的命令:

  # yum install sysstat



二.RPC和Http的区别:

目前有很多Java的RPC框架,有基于Json的,有基于XML,也有基于二进制对象的。

论复杂度,RPC框架肯定是高于简单的HTTP接口的。但毋庸置疑,HTTP接口由于受限于HTTP协议,需要带HTTP请求头,导致传输起来效率或者说安全性不如RPC。

现在问题是,遇到怎样的瓶颈了才需要或者说更适合用RPC(比如像阿里这么大的请求并发量,简单的HTTP肯定达不到预期),但问题是大家所在的公司,要有像阿里这么大的量是比较少的,甚至说1/1000的量可能都没有,那我们还需要使用RPC吗?

技术应该不是为了使用新技术而去使用,而应该是旧技术存在某些瓶颈,存在难以支撑或者扩展性越老越差等问题暴露出来之后,用新技术来进行解决。



http接口是在接口不多、系统与系统交互较少的情况下,解决信息孤岛初期常使用的一种通信手段;优点就是简单、直接、开发方便。利用现成的http协议进行传输。但是如果是一个大型的网站,内部子系统较多、接口非常多的情况下,RPC框架的好处就显示出来了,首先就是长链接,不必每次通信都要像http一样去3次握手什么的,减少了网络开销;其次就是RPC框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。第三个来说就是安全性。最后就是最近流行的服务化架构、服务化治理,RPC框架是一个强力的支撑



三.NIO的理解

3.1NIO和BIO的区别和各自适用的场景

区别:
BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要
的线程开销,当然可以通过线程池机制改善。
NIO:同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程
进行处理。

各自应用场景:
NIO适合处理连接数目特别多,但是连接比较短(轻操作)的场景,Jetty,Mina,ZooKeeper等都是基于java nio实现。
BIO方式适用于连接数目比较小且固定的场景,这种方式对服务器资源要求比较高,并发局限于应用中。


3.2给我们带来了些什么

事件驱动模型
避免多线程
单线程处理多任务
非阻塞I/O,I/O读写不再阻塞,而是返回0
基于block的传输,通常比基于流的传输更高效

更高级的IO函数,zero-copyIO多路复用大大提高了Java网络应用的可伸缩性和实用性

NIO一个重要的特点是:socket主要的读、写、注册和接收函数,在等待就绪阶段都是同步非阻塞的,真正的I/O操作是同步阻塞的(消耗CPU但性能非常高)。

 

解释的比较清楚的文章:

http://tech.meituan.com/nio.html?utm_source=tuicool&utm_medium=referral


四常用的集合

ArrayList的内部实现是基于基础的对象数组的,因此,它使用get方法访问列表中的任意一个元素时(random-access),它的速度要比LinkedList快


LinkedList基于链表的数据结构没有同步办法。若是多个线程同时接见一个List,则必须本身实现接见同步。一种解决办法是在创建List机会关一个同步的List:
List list = Collections.synchronizedList(new LinkedList(...)); 

 

Vector是同步的。由Vector创建的Iterator,固然和ArrayList创建的Iterator是同一接口,然则,因为Vector是同步的,当一个Iterator被创建并且正在被应用,另一个线程改变了Vector的状况(例如,添加或删除了一些元素),这时调用Iterator的办法时将抛出ConcurrentModificationException,是以必须捕获该异常。

 

总结特点如下:
类型内部结构顺序遍历速度随机遍历速度追加代价插入代价删除代价占用内存ArrayList数组高高中高高低LinkedList双向链表高低低低低中
所以:

  • 一般顺序遍历情况下使用ArrayList,但注意构造函数中设置初始大小
  • 尽量不对ArrayList进行插入或删除操作(删除尾部除外),若有多次删除/插入操作又有随机遍历的需求,可以再构建一个ArrayList,把复合条件的对象放入新ArrayList,而不要频繁操作原ArrayList
  • 经常有删除/插入操作而顺序遍历列表的情况下最适合使用LinkedList


五锁

只在REPEATABLE READ或以上的隔离级别下的特定操作才会取得gap lock或nextkey lock。


0 0
原创粉丝点击