1、BIO介绍

  • Java BIO就是传统的Java I/O编程,其相关的类和接口在java.io。

  • BIO(BlockingI/O):同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,可以通过线程池机制改善(实现多个客户连接服务器)。

  • BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,程序简单易理解。

    Read more »

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堆和方法区的垃圾收集。
      Read more »

1、JVM参数选项类型

1.1 标准参数选项

  • 特点

    • 以“-”开头。
    • 比较稳定,后续版本基本不会变化。
  • 可通过运行java -help查看所有标准参数选项。

    Read more »

1、内存泄漏的理解和分类

  • 内存泄漏:

    • 可达性分析算法来判断对象是否是不再使用的对象,本质都是判断一个对象是否还被引用。那么对于这种情况下,由于代码的实现不同就会出现很多种内存泄漏问题(让JVM误以为此对象还在引用中,无法回收,造成内存泄漏)。

    • 严格来说,只有对象不会再被程序用到了,但是GC又不能回收他们的情况,才叫内存泄漏。

    • 但实际情况很多时候一些不太好的实践(或疏忽)会导致对象的生命周期变得很长甚至导致OOM,也可以叫做宽泛意义上的“内存泄漏”

Read more »

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默认开启压缩。
    Read more »

1、性能优化概述

  • 性能优化大致分为以下三个步骤:

    • ①性能监控
      • 一种以非强行或者入侵方式收集或查看应用运营性能数据的活动。
      • 监控通常是指一种在生产、质量评估或者开发环境下实施的带有预防或主动性的活动。
      • 当应用相关干系人提出性能问题却没有提供足够多的线索时,首先我们需要进行性能监控,随后是性能分析。
    • ②性能分析
      • 一种以侵入方式收集运行性能数据的话动,它会影响应用的吞吐量或响应性。
      • 性能分析是针对性能问题的答复结果,关注的范围通常比性能监控更加集中。
      • 性能分析很少在生产环境下进行,通常是在质量评估、系统测试或者开发环境下进行,是性能监控之后的步骤。
    • ③性能调优
      • 一种为改善应用响应性或香吐量而更改参数、源代码、属性配置的活动,性能调优是在性能监控、性能分析之后的活动。
        Read more »

1、概述

  • 线程安全集合类可以分为三大类:

    • 遗留的线程安全集合如Hashtable、Vector。
    • 使用Collections装饰的线程安全集合,如:
      • Collections.synchronizedCollection
      • Collections.synchronizedList
      • Collections.synchronizedMap
      • Collections.synchronizedSet
      • Collections.synchronizedNavigableMap
      • Collections.synchronizedNavigableSet
      • Collections.synchronizedSortedMap
      • Collections.synchronizedSortedSet
    • java.util.concurrent.*
Read more »

1、ReentrantLock介绍

  • 相对于synchronized它具备如下特点:

    • 可中断。
    • 可以设置超时时间。
    • 可以设置为公平锁。
    • 支持多个条件变量。
    • 与synchronized一样,都支持可重入。
Read more »

1、自定义线程池

  • 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?在Java中可以通过线程池来达到这样的效果。 下面先自定义一个线程池,关键图如下:

Read more »

1、CAS解决线程安全问题

  • java.util.concurrent.atomic包下类都是原子类,原子类都是基于sun.misc.Unsafe实现的, 基本可以分为一下几类:

  • 原子性基本数据类型:AtomicBoolean、AtomicInteger、AtomicLong

  • 原子性对象引用类型:AtomicReferenceAtomicStampedReference、AtomicMarkableReference

  • 原子性数组:AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray

  • 原子性对象属性更新:AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdater

    Read more »