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

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

一.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。



相关文章
|
10天前
|
运维 Java
Java版HIS系统 云HIS系统 云HIS源码 结构简洁、代码规范易阅读
云HIS系统分为两个大的系统,一个是基层卫生健康云综合管理系统,另一个是基层卫生健康云业务系统。基层卫生健康云综合管理系统由运营商、开发商和监管机构使用,用来进行运营管理、运维管理和综合监管。基层卫生健康云业务系统由基层医院使用,用来支撑医院各类业务运转。
36 5
|
19天前
|
设计模式 Java
Java基础—笔记—多态、final、抽象类、接口篇
该文介绍了编程中的多态、final和抽象类、接口相关概念。多态允许子类重写父类方法,通过父类引用调用子类方法,实现解耦和提高代码灵活性,但也可能导致无法使用子类特有功能,需通过强制类型转换解决。final用于修饰不可变的类、方法或变量,防止继承、重写和多次赋值。抽象类是一种包含抽象方法的类,用于强制子类重写特定方法,实现多态,适用于模板方法设计模式,解决代码重复问题。
17 0
|
19天前
|
Java
Java基础—笔记—static篇
`static`关键字用于声明静态变量和方法,在类加载时初始化,只有一份共享内存。静态变量可通过类名或对象访问,但推荐使用类名。静态方法无`this`,不能访问实例成员,常用于工具类。静态代码块在类加载时执行一次,用于初始化静态成员。
10 0
|
19天前
|
Java API 索引
Java基础—笔记—String篇
本文介绍了Java中的`String`类、包的管理和API文档的使用。包用于分类管理Java程序,同包下类无需导包,不同包需导入。使用API时,可按类名搜索、查看包、介绍、构造器和方法。方法命名能暗示其功能,注意参数和返回值。`String`创建有两种方式:双引号创建(常量池,共享)和构造器`new`(每次新建对象)。此外,列举了`String`的常用方法,如`length()`、`charAt()`、`equals()`、`substring()`等。
15 0
|
21天前
|
安全 Java 开发者
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第9天】本文将深入探讨Java并发编程的核心概念,包括线程安全和性能优化。我们将详细解析Java中的同步机制,包括synchronized关键字、Lock接口以及并发集合等,并探讨它们如何影响程序的性能。此外,我们还将讨论Java内存模型,以及它如何影响并发程序的行为。最后,我们将提供一些实用的并发编程技巧和最佳实践,帮助开发者编写出既线程安全又高效的Java程序。
|
20天前
|
算法 Java 开发者
Java中的多线程编程:概念、实现与性能优化
【4月更文挑战第9天】在Java编程中,多线程是一种强大的工具,它允许开发者创建并发执行的程序,提高系统的响应性和吞吐量。本文将深入探讨Java多线程的核心概念,包括线程的生命周期、线程同步机制以及线程池的使用。接着,我们将展示如何通过继承Thread类和实现Runnable接口来创建线程,并讨论各自的优缺点。此外,文章还将介绍高级主题,如死锁的预防、避免和检测,以及如何使用并发集合和原子变量来提高多线程程序的性能和安全性。最后,我们将提供一些实用的性能优化技巧,帮助开发者编写出更高效、更稳定的多线程应用程序。
|
3天前
|
存储 安全 算法
【JAVA】HashMap扩容性能影响及优化策略
【JAVA】HashMap扩容性能影响及优化策略
|
18天前
|
安全 算法 Java
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第11天】 在Java中,高效的并发编程是提升应用性能和响应能力的关键。本文将探讨Java并发的核心概念,包括线程安全、锁机制、线程池以及并发集合等,同时提供实用的编程技巧和最佳实践,帮助开发者在保证线程安全的前提下,优化程序性能。我们将通过分析常见的并发问题,如竞态条件、死锁,以及如何利用现代Java并发工具来避免这些问题,从而构建更加健壮和高效的多线程应用程序。
|
19天前
|
Java Maven
【Java报错】显示错误“Error:java: 程序包org.springframework.boot不存在“
【Java报错】显示错误“Error:java: 程序包org.springframework.boot不存在“
37 3
|
22小时前
|
存储 Java 开发工具
【Java探索之旅】用面向对象的思维构建程序世界
【Java探索之旅】用面向对象的思维构建程序世界
9 0