Java知识点
2019-05-20 10:41:54 0 举报
AI智能生成
Java核心知识点
作者其他创作
大纲/内容
Java平台
语言特性,面向对象,反射,反省...
java/jvm生态
Java EE
Spring
Hadoop
...
Java类库
核心类库
安全类库
jdk,management等
第三方类库
Java虚拟机
垃圾收集器
运行时
动态编译
辅助功能如JFR等
工具
辅助工具,jlink.jar,jdeps...
编译器javac,sjavac
诊断工具:jmap,jstack,jconsole,jhsdb,jcmd
Exception与Error
类图
Object
Throwable
Error
LinkageError:
NoClassDeFoundError
UnsatisfiedLinkError
ExceptionInInitializeError
...
VirtualmachineError:
OutOfmemoryError
StackOverflowError
Exception
IOException... checked exception
RuntimeException:
NullPointerException
ClassCastException
SecurityException
处理原则
尽量不要捕获Exception这样的通用异常,而应捕获特定异常
不要吞掉异常
捕获后未处理
e.printstacktrace会输出到标准输出,输出在不同环境位置不确定
自定义异常的考虑
是否需要定义成Checked Exception
保证诊断信息足够的同时,也要避免包含敏感信息
try-catch代码会产生额外的性能开销,尽量不要一个大的try包住整段代码
每实例化一个Exception,都会对当时的栈进行快照,如果异常发生频繁,开销就不可忽略
关于Checked Exception的争论
checked exception假设我们捕获异常并恢复程序,但大多数情况下,我们不可能恢复程序
checked exception不兼容functional编程
http://literatejava.com/exceptions/checked-exceptions-javas-biggest-mistake/
final,finally,finalize
强引用,软引用,弱引用,幻想引用
强引用
就是我们最常见的普通对象引用,只要还有强引用指向一个对象,就能表明对象还“活着”,垃圾收集器不会碰这种对象。对于一个普通的对
象,如果没有其他的引用关系,只要超过了引用的作用域或者显式地将相应(强)引用赋值为null,就是可以被垃圾收集的了,当然具体回收时机还是要看垃圾收集策略
软引用
是一种相对强引用弱化一些的引用,可以让对象豁免一些垃圾收集,只有当JVM认为内存不足时,才会去试图回收软引用指向的对象。 JVM会确保在抛
出OutOfMemoryError之前,清理软引用指向的对象。软引用通常用来实现内存敏感的缓存,如果还有空闲内存,就可以暂时保留缓存,当内存不足时清理掉,这样就保证了使用缓存的同时,不会耗尽内存
图片缓存框架中, “内存缓存”中的图片是以这种引用来保存,使得JVM在发生OOM之前,可以回收这部分缓存
弱引用
并不能使对象豁免垃圾收集,仅仅是提供一种访问在弱引用状态下对象的途径。这就可以用来构建一种没有特定约束的关系,比如,维护一种非强制性的映射关系,如果试图获取时对象还在,就使用它,否则重新实例化。它同样是很多缓存实现的选择
在静态内部类中,经常会使用虚引用。例如,一个类发送网络请求,承担callback的静态内部类,则常以虚引用的方式来保存外部类(宿主类)的引用,当外部类需要被JVM回收时,不会因为网络请求没有及时回来,导致外部类不能被回收,引起内存泄漏
幻象引用/虚引用
有时候也翻译成虚引用,你不能通过它访问对象。幻象引用仅仅是提供了一种确保对象被fnalize以后,做某些事情的机制,比如,通常用来做所谓的PostMortem清理机制,我在专栏上一讲中介绍的Java平台自身Cleaner机制等,也有人利用幻象引用监控对象的创建和销毁
String,StringBuilder,StringBuffer
动态代理
Integer与int
Vector,ArrayList,LinkedList
Vector与ArrayList都是基于数组实现,随机访问性能好,需要在中间插入删除元素时性能较差
LinkedList基于双向链表实现,插入删除性能好,随机访问性能差
Vector是线程安全的,ArrayList是非线程安全的
集合
Collection
List
AbstractList
Vector
ArrayList
AbstractSequentialList
LinkedList
Set
AbstractSet
HashSet
LinkedHashSet
TreeSet
Sortedset
Queue
AbstractQueue
PriorityQueue
Deque
ArrayDeque
AbstractCollection
Map
HashTable
Sortedmap
NavigableMap
AbstractMap
TreeMap
EnumMap
HashMap
Set通过Map实现
使用HashMap注意事项
equals相等, hashCode一定要相等
重写了hashCode也要重写equals
hashCode需要保持一致性,状态改变返回的哈希值仍然要一致
equals的对称、反射、传递等特性
HashMap负载因子
负载因子 * 容量 > 元素数量
到达一定值,默认64时,链表会树化,减小线性查找
线程安全
IO
BIO
NIO
NIO2.0(AIO)
文件拷贝
原则
在程序中,使用缓存等机制,合理减少IO次数
使用transferTo等机制,减少上下文切换和额外IO操作
尽量减少不必要的转换过程,比如编解码;对象序列化和反序列化,比如操作文本文件或者网络通信,如果不是过程中需要使用文本信息,可以考虑不要将二进制信息转换成字符串,直接传输二进制信息
Buffer
设计模式
创建模式
工厂模式Factory
单例模式Singleton
构建器模式Builder
原型模式Prototype
结构模式
桥接Bridge
适配器Adapter
装饰者Decorator
代理Proxy
组合模式Composite
外观模式Facade
享元模式Flyweight
行为型模式
策略模式Strategy
解释器模式Interpreter
命令模式Command
观察者模式Observer
迭代器模式Iterator
模板方法Template Method
访问者模式Visitor
类加载
加载
链接
验证
准备
解析
初始化
虚拟机
程序计数器
栈
堆
方法区
运行时常量池
本地方法栈
监控与诊断
参数
-Xmx value
-Xms value
-XX:NewRatio=value
-XX:NewSize=value
-XX:SurvivorRatio=value
垃圾收集器
Serial GC
-XX:+UseSerialGC
老年代
Serial Old
Mark-Compact
新生代
复制算法
ParNew GC
只针对新生代,Servial GC的多线程版本
常配合CMS使用
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC
CMS
Mark-Sweep
存在碎片化问题,难以避免在长时间运行情况下发生full GC,导致停顿
Java9中已废弃
Parrallel GC
吞吐量优先
-XX:+UseParallelGC
可设置停顿时间及GC比例
-XX:MaxGCPauseMillis=value
-XX:GCTimeRatio=N
GC时间和用户时间比例 = 1 / (N+1)
标记整理
G1
兼顾吞吐量和停顿时间的GC实现
G1未必能做到CMS在最好情况
下的延时停顿,但是最差情况要好很多
标记整理,有效避免内存水平
存活对象统计算法
引用计数
存在循环引用问题
可达性分析
类卸载
-XX:+ClassUnloadingWithConcurrentMark
垃圾收集算法
复制
需要预留一定空间
新生代及G1算法采用复制算法
标记-清除
标记清除效率有限
碎片不可避免,不适合特别大的堆,出现full GC时暂停时间无法接受
标记-整理
与标记清除类似,但是在清理过程中会移动对象,避免内存碎片
设置晋升阈值
-XX:MaxTenuringThreshold=<N>
调优思路
理解应用需求和问题,确定调优目标
内存占用
延时
吞吐量
掌握JVM和GC状态,定位具体问题,确定调优必要性
根据目标及现状考虑调整内存及选择合适GC
验证是否达到调优目标
Java运行在Docker容器中的问题
安全
注入
sql注入
XML注入
命令注入
hash碰撞DDOS
书籍
Java编程思想
EffectiveJava
HeadFirst Java
Java并发编程模式
深入理解Java虚拟机
Java性能优化权威指南
Spring实战
CloudNativeJava
深入分布式缓存
Mybatis
分几层
每层有哪些模块
Spring
Dictionary
0 条评论
下一页