w

wnwk

V1

2022/12/02阅读:27主题:默认主题

Java备忘录

redis

jvm

类加载机制

顶级类加载器是 启动类加载器,加载jdk lib目录下的类,子类是 扩展加载器,加载ext 目录下的类,应用加载器 加载应用的类。通过不同的类加载器可以实现类的隔离,比如tomcat 通过实现webappclassloader来加载不同的应用,保证了应用中类的隔离,由于所有类加载器的父类都是jdk的类加载器,又可以共享jdk加载的类

  • 双亲委派机制,加载类的时候会依次调用扩展加载器启动类加载器,如果没有找到对应的类,才会从子类中寻找,这种方式避免了重复加载,同时还可以防止核心api被篡改

java -XX:+PrintFlagsFinal 可以查看定义的非标参数

java -XX:+PrintCommandLineFlags -version 查看JVM使用的什么垃圾收集器

jvm 内存分配是的指针碰撞和空闲列表机制

  • 指针碰撞 用于分配连续的内存空间,分配一个对象移动一下指针,指向下一块空闲区域的起始位置。
  • 空闲列表用于分配不连续的空间,通过链表保存空先内存

判断垃圾对象的方法

  • 引用计数器,如果对象没有被引用,就是垃圾对象,无法解决循环引用的问题
  • 可达分析算法,以gcroot(本地变量,静态变量等)为根开始寻找引用对象,如果有不可达的对象就是垃圾对象

类被回收的条件

  • 所有实例都没回收了
  • 类的classloader 也被回收了
  • 类没有被引用

垃圾回收算法

  • 复制算法,需要额外的内存空间,把存活对象移动到新的内存空间,移动完后清空垃圾对象。年轻代使用的就是复制算法
  • 标记清除,找到存活对象打上标记,清除所有未标记的对象,会有内存碎片
  • 标记整理,先标记,然后做整理,尽量把存活对象放在一起,减少内存碎片。用于老年代

CMS回收算法

在并发标记阶段如果出现了垃圾过多的导致的fullGc,cms就会降级为serial gc

对象逃逸

对于方法内部定义的成员变量,这类变量不会被外部引用到,对于这类变量jvm 会优先放到线程栈内,潜在减少了gc。如果这类变量被此方法外的对象引用了就称为对象逃逸(比如和对象被方法作为返回值返回了)

https://blog.csdn.net/weixin_45525272/article/details/127048854

java

threadpool

  • corePoolSize:核心线程池的大小
  • maximumPoolSize:最大线程池的大小
  • keepAliveTime:当线程池中线程数大于corePoolSize,并且没有可执行任务时大于corePoolSize那部分线程的存活时间
  • unit:keepAliveTime的时间单位
  • workQueue:用来暂时保存任务的工作队列,jdk中默认的线程池指定的都是无界队列。如果是无界队列那么设置maximumPlloSize就没有意义了,所以一般建议要自定义线程池
  • threadFactory:线程工厂提供线程的创建方式,默认使用Executors.defaultThreadFactory()
  • handler:当线程池所处理的任务数超过其承载容量或关闭后继续有任务提交时,所调用的拒绝策略

分类:

后端

标签:

后端

作者介绍

w
wnwk
V1