JVM 基本知识

简介

JVM 内存模型

JVM 类加载

JVM 垃圾回收

算法

  用于设置年轻代的大小,建议设为整个堆大小的1/3或者1/4,两个值设为一样大。
  用于设置Eden和其中一个Survivor的比值,这个值也比较重要
  这个参数用于显示每次Minor GC时Survivor区中各个年龄段的对象的大小

用于设置晋升到老年代的对象年龄的最小值和最大值,每个对象在坚持过一次Minor GC之后,年龄就加1

 设置非堆内存初始值,默认是物理内存的1/64;
 设置最大非堆内存的大小,默认是物理内存的1/4;
 最大可用堆内存
 最小使用堆内存

线程

先来简单了解下什么是线程: * 是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务

Java启动线程方法

继承Thread类

实现Runnable接口

线程池

为什么要用线程池

Java 线程池

newCachedThreadPool

newFixedThreadPool

newScheduledThreadPool

newSingleThreadExecutor

在了解锁之前先简单介绍下CAS:

 竞争不大的时候系统开销小。
 循环时间长开销大。
 ABA问题。
 只能保证一个共享变量的原子操作。

在java中有了并发,就有了锁,大概有如下几种类型:

非公平锁

公平锁

偏向锁

 -XX:BiasedLockingStartupDelay=0
 -XX:-UseBiasedLocking=false,那么程序默认会进入轻量级锁。
 -XX:BiasedLockingStartupDelay=0 -XX:+TraceBiasedLocking

轻量级锁和自旋锁

乐观锁

可重入锁

分段锁

自旋锁

重量级锁

Java中具体锁

ReentrantLock

ReentrantReadWriteLock

常用方法:

Synchronized

  * 线程进入同步方法中。
  * 为了继续执行临界区代码,线程必须获取 Monitor 锁。
  * 如果获取锁成功,将成为该监视者对象的拥有者。
  * 任一时刻内,监视者对象只属于一个活动线程(The Owner)
  * 拥有监视者对象的线程可以调用 wait() 进入等待集合(Wait Set),同时释放监视锁,进入等待状态。
  * 其他线程调用 notify() / notifyAll() 接口唤醒等待集合中的线程,
  * 这些等待的线程需要重新获取监视锁后才能执行 wait() 之后的代码。
  * 同步方法执行完毕了,线程退出临界区,并释放监视锁。