分析GC日志
1、GC日志格式
1.1 GC分类
- 针对HotSpot VM的实现,它里面的GC按照回收区域又分为两大种类型:一种是部分收集(Partial GC),一种是整堆收集(Full GC)。
- 部分收集:不是完整收集整个Java堆的垃圾收集。其中又分为:
- 新生代收集(Minor GC/Young GC):只是新生代(Eden\S0,S1)的垃圾收集。
- 老年代收集(Major GC/Old GC):只是老年代的垃圾收集。
- 目前,只有CMS GC会有单独收集老年代的行为。
- 注意,很多时候MajorGC会和Full GC混淆使用,需要具体分辨是老年代回收还是整堆回收。
- 混合收集(Mixed GC):收集整个新生代以及部分老年代的垃圾收集。
- 目前,只有G1 GC会有这种行为。
- 整堆收集(Full GC):收集整个java堆和方法区的垃圾收集。
- 部分收集:不是完整收集整个Java堆的垃圾收集。其中又分为:
内存泄漏
浅堆和深堆
1、浅堆
浅堆(Shallow Heap)是指一个对象所消耗的内存。在32位系统中,一个对象引用会占据4个字节,一个int类型会占据4个字节,long型变量会占据8个字节,每个对象头需要占用8个字节。根据堆快照格式不同,对象的大小可能会向8字节进行对齐。
- 对象头 = 标记部分 + 原始对象引用。
- 标记部分包括hashcode、gc分代年龄、锁状态标志、线程持有锁、偏向线程锁id,偏向时间戳,这一部分在32位机器上为4byte,64位机器上为8byte。
- 原始对象引用是对象的指针、通过这个指针找到对象的实例、该数据可以压缩,这一部分在32位机器上为4byte,64位机器上为8byte,如果开启了压缩(UseCompreddedOops),大小为4byte,jdk8默认开启压缩。
JVM命令行监控工具
1、性能优化概述
性能优化大致分为以下三个步骤:
- ①性能监控
- 一种以非强行或者入侵方式收集或查看应用运营性能数据的活动。
- 监控通常是指一种在生产、质量评估或者开发环境下实施的带有预防或主动性的活动。
- 当应用相关干系人提出性能问题却没有提供足够多的线索时,首先我们需要进行性能监控,随后是性能分析。
- ②性能分析
- 一种以侵入方式收集运行性能数据的话动,它会影响应用的吞吐量或响应性。
- 性能分析是针对性能问题的答复结果,关注的范围通常比性能监控更加集中。
- 性能分析很少在生产环境下进行,通常是在质量评估、系统测试或者开发环境下进行,是性能监控之后的步骤。
- ③性能调优
- 一种为改善应用响应性或香吐量而更改参数、源代码、属性配置的活动,性能调优是在性能监控、性能分析之后的活动。
- ①性能监控
线程安全集合类
1、概述
线程安全集合类可以分为三大类:
- 遗留的线程安全集合如Hashtable、Vector。
- 使用Collections装饰的线程安全集合,如:
- Collections.synchronizedCollection
- Collections.synchronizedList
- Collections.synchronizedMap
- Collections.synchronizedSet
- Collections.synchronizedNavigableMap
- Collections.synchronizedNavigableSet
- Collections.synchronizedSortedMap
- Collections.synchronizedSortedSet
- java.util.concurrent.*
Java之AQS
Java线程池
Java之CAS
1、CAS解决线程安全问题
java.util.concurrent.atomic包下类都是原子类,原子类都是基于sun.misc.Unsafe实现的, 基本可以分为一下几类:
原子性基本数据类型:AtomicBoolean、AtomicInteger、AtomicLong
原子性对象引用类型:AtomicReference、AtomicStampedReference、AtomicMarkableReference
原子性数组:AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray
原子性对象属性更新:AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdater