1.什么是高性能?
根据百度百科的定义,一个程序对内存和时间的需求称为程序性能。故高性能就是程序对内存的使用率低,运行时间短。
2.怎么进行java高性能编程?
两个优化指标:时间优化,空间优化。
2.1 并发编程中锁的优化与选择
并发编程中,由于cpu的三级缓存,cpu的指令重排,引发的可见性问题;JIT编译器的字节码指令重排,引发的原子性问题。故必须引用到锁的机制,来保证共享数据的安全性问题。对jvm层面,提供了synchronized关键字来保证安全性问题,由于synchronized是悲观锁,独占锁,在多线程下,synchronized同步的代码块只能有一个线程去执行,而在读多写少的场景,显然这种方式会导致时间效率低,故可使用读写锁优化。
在一些业务场景中,如StringBuffer拼接字符串,由于StringBuffer是线程安全,故在使用时,会出现大量加锁解锁过程,也会引发时间效率问题,可以使用+EliminateLocks参数进行锁削除(锁削除是指虚拟机即时编译器在运行时,对一些代码上要求同步,但是被检测到不可能存在共享数据竞争的锁进行削除);在一个代码块出现大量加锁解锁操作,也会引起时间效率问题,可进行锁粗化(锁粗化就是告诉我们任何事情都有个度,有些情况下我们反而希望把很多次锁的请求合并成一个请求,以降低短时间内大量锁请求、同步、释放带来的性能损耗)
CAS机制替代锁机制,CAS是英文单词Compare and Swap的缩写,翻译过来就是比较并替换。提供了CPU级别数据安全问题,使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B。更新一个变量的时候,只有当变量的预期值A和内存地址V当中的实际值相同时,才会将内存地址V对应的值修改为B。
2.2 网络编程优化
jdk1.4之前提供bio进行同步阻塞编程,即服务端接收客户端的连接时每次都需要一个新线程,显然对空间利用率很低;故在JDK1.4推出nio同步非阻塞编程,故一个服务端可以接收多个客户端连接;极大提到了空间利用率。而netty使用了reactor线程模型,使用异步非阻塞编程,极大提高了对数据的处理。