Java核心技术36讲-基础部分


运行模式
  编译执行
  解释执行
  混合执行
  分层编译
  AOT(Ahead-of-Time),字节码编译为机器代码,jaotc工具

语言特性
泛型
Lambda特性
基础类库
集合
IO/NIO
网络
并发
安全
ClassLoader(Bootstrap,Application,Extension)
类的加载过程-加载,验证,链接,初始化
SerialGC,Parallel GC,CMS,G1
编译器,运行环境,安全工具,诊断和监控工具
JVM之上的其他语言

jaotc --output libHelloWorld.so HelloWorld.class
jaotc --output libjava.base.so --module java.base
java -XX:AOTLibrary=./libHelloWorld.so,./libjava.base.so HelloWorld

Throwable和两个子类
Exception,又包括可检测(checked)异常,不检测(unchecked)异常-也就是运行时异常
Error
比如
ClassNotFoundException,运行时通过Class.forName()产生的异常
NoClassDefFoundError,JVM或ClassLoader实例尝试加载类时的异常
try-catch机制,因为创建Throwable要调用native代码fillInStacktrace,会影响性能

fianl,并发时可以省去防御代码,JVM优化时不会final没什么用
finally
finalize,这个会影响垃圾收集性能,现在可以用幻引用+引用队列的方式替代
finalize使用不当会导致死锁,挂起等,java中调用其他语言代码时,这个函数会有用


引用类型
1.强引用
2.软引用Softly Reachable,内存不足时被回收
3.弱引用Weakly Reachable,GC时被回收
4.幻引用Phantom Reachable,始终返回null,通过引用队列可以确定此对象已被回收
引用队列,被回收的对象会放入队列中
软引用的参数
-XX:SoftRefLRUPolicyMSPerMB=N
GC的诊断参数
-XX:+PrintReferenceGC  此参数在JDK9中已不存在


String,StringBuffer,StringBuilder
String的intern()放入PermGen区
-XX:StringTableSize=N
-XX:+PrintStringTableStatistics  

SymbolTable statistics:
Number of buckets       :   20011
Average bucket size     :       1
Variance of bucket size :       1
Std. dev. of bucket size:       1
Maximum bucket size     :       5
StringTable statistics:
Number of buckets       :   60013
Average bucket size     :       0
Variance of bucket size :       0
Std. dev. of bucket size:       0
Maximum bucket size     :       3

intern()是一种显示的排重机制,JDK8之后可以自动排重
-XX:+UseStringDeduplication

字符串的一些基础操作会直接利用JVM内部的Intrinsic机制,运行的就是特殊优化的本地代码,不是Java代码生成的字节码,Intrinsic可以理解为一种利用native方式hard-code的逻辑,算是一种特别的内联,有多优化还是需要直接使用特定的CPU指定

java -XX:+PrintCompilation -XX:+UnlockDiagnosticVMOptions -XX:+PrintInlining [java类]
     51    1       3       java.lang.String::hashCode (55 bytes)
     52    2       3       java.lang.String::equals (81 bytes)
     53    3       3       java.lang.String::charAt (29 bytes)
                              @ 18  java/lang/StringIndexOutOfBoundsException::<init> (not loaded)   not inlineable
     53    4       3       java.lang.String::length (6 bytes)
     55    7     n 0       java.lang.System::arraycopy (native)   (static)
     56    5       3       java.lang.String::indexOf (70 bytes)
                              @ 66   java.lang.String::indexOfSupplementary (71 bytes)   callee is too large
     57    6       3       java.lang.Object::<init> (1 bytes)
     57    8       3       java.lang.Math::min (11 bytes)
     57    9       1       java.lang.ref.Reference::get (5 bytes)
     57   10       1       java.lang.ThreadLocal::access$400 (5 bytes)
     61   11       3       java.lang.AbstractStringBuilder::append (50 bytes)
                              @ 5   java.lang.AbstractStringBuilder::appendNull (56 bytes)   callee is too large
                              @ 10   java.lang.String::length (6 bytes)
                              @ 21   java.lang.AbstractStringBuilder::ensureCapacityInternal (27 bytes)
                                @ 17   java.lang.AbstractStringBuilder::newCapacity (39 bytes)   callee is too large
                                @ 20   java.util.Arrays::copyOf (19 bytes)
                                  @ 11   java.lang.Math::min (11 bytes)
                                  @ 14   java.lang.System::arraycopy (0 bytes)   intrinsic
                              @ 35   java.lang.String::getChars (62 bytes)   callee is too large
     61   12       3       java.lang.String::getChars (62 bytes)
                              @ 9  java/lang/StringIndexOutOfBoundsException::<init> (not loaded)   not inlineable
                              @ 27  java/lang/StringIndexOutOfBoundsException::<init> (not loaded)   not inlineable
                              @ 43  java/lang/StringIndexOutOfBoundsException::<init> (not loaded)   not inlineable
                              @ 58   java.lang.System::arraycopy (0 bytes)   intrinsic

Java9自后,引入了Compact Strings的设计,将char[]改为byte[],加载编码的coder加速了性能
相关的Intrinsic也做了重构,但对开发者是透明的
 


反射
Java9做了模块化对反射做了限制,但兼容老版本
静态代理,动态代理
JDK Proxy
Spring中的cglib实现
 

集合类
List
Set
Map
Queue/Deuqe
相关的排序算法
Java9的 List.of() 简化创建

Hashtable,HashMap,TreeMap,LinkedHashMap
equals和hashCode
HashMap的容量(capacity)和负载系数(load factor),树化(冲突后的链表长>8)
HashMap中的hash不是用key本身的hashC偶的,而是来自于HashMap内部的另外一个hash函数
将hash的高位移到地位进行异或运算,因为有些数据计算出的哈希值差异主要在高位,而HashMap里的哈希寻址是忽略容量以上的高位,那么这种处理方式就可以有效避免类似情况下的哈希碰撞

开放定址法
基本思想是:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中。

再哈希法
这种方法是同时构造多个不同的哈希函数:
Hi=RH1(key)  i=1,2,…,k
当哈希地址Hi=RH1(key)发生冲突时,再计算Hi=RH2(key)……,直到冲突不再产生。这种方法不易产生聚集,但增加了计算时间。

链地址法
这种方法的基本思想是将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。
 

参考

Java技术36讲-笔记

猜你喜欢

转载自blog.csdn.net/hixiaoxiaoniao/article/details/86484780