> 文章列表 > Java知识点学习(第9天)

Java知识点学习(第9天)

Java知识点学习(第9天)

什么是STW?

STW:Stop The World,在垃圾回收算法执行的时候,需要将JVM内存冻结的一种状态。在STW状态下,Java的所有线程所有线程都是停止的(GC线程除外),native方法(底层通过C/C++实现的方法)也是可以执行的,但是不能和JVM进行交互。GC各种算法优化重点就是减少STW,同时这也是JVM调优的重点。

常用的JVM启动参数有哪些?

在大多数业务场景下,常用的JVM配置也就10个左右:

  • 设置堆内存,最大内存4g,最小内存4g(-Xmx4g -Xms4g)
  • 指定GC算法,最大的垃圾回收栈中的时间(-XX:+UseG1GC
  • -XX:MaxGCPauseMillis=50) 指定GC并行线程数(-XX:ParallelGCThreads=4)
  • 打印GC日志,日志时间戳(-XX:+PrintGCDetails -XX:+PrintGCDateStamps)
  • 指定GC日志文件(-Xloggc:gc.log)
  • 指定Meta区最大值(-XX:MaxMetaspaceSize=2g)

说说对线程安全、守护线程的理解

线程安全是指,我们写的某段代码,在多个线程同时执行这段代码时,不会产生混乱,依旧能得到正常的结果,比如i++,i初始化为0,两个线程来同时执行这段代码,如果线程安全,那应该是以一个线程为1,一个线程为2,如果两个线程都为1,则表示这段代码是线程不安全的。

线程分为用户线程和守护线程,用户线程就是普通线程,JVM的后台线程,比如垃圾回收线程就是一个守护线程,守护线程会在其他普通线程都停止运行后自动关闭,也可以通过thread.setDaemin(true)来把一个线程设置为守护线程。

ThreadLocal的底层原理

  1. ThreadLocal是Java本地提供的线程存储机制,该机制可以将数据缓存在某个现场内部,该线程可以在任意时刻,任意方法中获取缓存的数据。
  2. ThreadLocal底层是通过ThreadLocalMap实现的,每个Thread对象都存在一个ThreadLocalMap,Map的key对应的是ThreadLocal对象,Map的value为缓存的值。
  3. 如果在线程池中使用ThreadLocal会造成内存泄漏,因为在ThreadLocal对象使用完之后,应该要把设置的key、value,也就是entry对象进行回收,而线程池中的线程不会回收,线程对象是通过强引用指向ThreadLocalMap的,ThreadLocalMap通过强引用指向Entry对象,线程不回收,entry对象也不会回收,从而出现内存泄漏,解决方法是,在使用了ThreadLocal对象之后,手动调用ThreadLocal的remove方法,手动清除entry对象。
  4. ThreadLocal最经典的应用场景就是连接管理(一个线程持有一个连接,该连接对象可以在不同的方法之间进行传递)

并发、并行、串行之间的区别

  1. 串行:一个任务执行完,才能执行下个任务。
  2. 并行:两个任务同时执行。
  3. 并发:两个任务整体上看是同时执行的,在底层,两个任务被拆成了很多份,然后一个一个执行,站在更高的角度上看两个任务在同时执行。