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 »

1、Java内存模型

  • JMM即Java Memory Model,它定义了主存(即JVM中的方法区和堆区)、工作内存(即JVM中的虚拟机栈)抽象概念,底层对应着CPU寄存器、缓存、硬件内存、CPU指令优化等。
    • JMM体现在以下几个方面:
      • 原子性-保证指令不会受到线程上下文切换的影响。
      • 可见性-保证指令不会受cpu缓存的影响。
      • 有序性-保证指令不会受cpu指令并行优化的影响。
        Read more »

1、成员变量和局部变量

  • 成员变量和静态变量的线程安全性
    • 如果它们没有共享,则线程安全。
    • 如果它们被共享了,根据它们的状态是否能够改变,又分两种情况。
      • 如果只有读操作,则线程安全。
      • 如果有读写操作,则这段代码是临界区,需要考虑线程安全。
  • 局部变量的线程安全性
    • 局部变量是线程安全的。
    • 但局部变量引用的对象则未必。
      • 如果该对象没有逃离方法的作用访问,它是线程安全的。
      • 如果该对象逃离方法的作用范围,需要考虑线程安全。
        Read more »

1、守护线程

  • 默认情况下,Java进程需要等待所有线程都运行结束,才会结束。有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    @Slf4j
    public class TestThread {
    public static void main(String[] args) throws InterruptedException {
    Thread t1 = new Thread(() -> {
    while (true) {
    if (Thread.currentThread().isInterrupted()) {
    break;
    }
    }
    log.debug("结束");
    }, "t1");
    // 设置该线程为守护线程
    t1.setDaemon(true);
    t1.start();

    Thread.sleep(1000);
    log.debug("结束");
    }
    }
Read more »