2024年10月 第3页

  • 2024.10.11 | cuithink | 40次围观
    CMS垃圾回收器
    回收流程:初始标记(STW,标记GC Root直接关联对象)->并发标记(标记GC Root 所有关联对象)->重新标记(STW)->并发清除(清除不可达对象回收空间,浮动垃圾)后面还一步,是并发重置。CMS的两种模式和一种策略:Backgroud CMS:在并发标记之后,重新标记之前多了两步:并发预处理和可中止的预处理:Eden空间使用超过2M的时候启动可中断的并发预清理(CMS-concurrent-abortable-preclean),到Eden空间...
  • 2024.10.11 | cuithink | 3次围观
    三色标记
    在并发标记的过程中,因为标记期间应用线程还在继续跑,对象间的引用可能发生变化,多标和漏标的情况就有可能发生。这里引入“三色标记”来给大家解释下,把Gc roots可达性分析遍历对象过程中遇到的对象, 按照“是否访问过”这个条件标记成以下三种颜色:黑色:表示对象已经被垃圾收集器访问过, 且这个对象的所有引用都已经扫描过。 黑色的对象代表已经扫描过, 它是安全存活的, 如果有其他对象引用指向了黑色对象, 无须重新扫描一遍。&nbs...
  • 2024.10.11 | cuithink | 24次围观
    垃圾收集算法
    已经能够确定一个对象为垃圾之后,接下来要考虑的就是回收,怎么回收呢?得要有对应的算法,下面介绍常见的垃圾回收算法。高效   健壮标记-清除(Mark-Sweep)标记找出内存中所有的存活对象,并且把它们标记出来清除清除掉被标记需要回收的对象,释放出对应的内存空间缺点标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程 序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。 (1)标记和清除两个过程都比较耗时,...
  • 2024.10.11 | cuithink | 38次围观
    如何确定一个对象是垃圾
    要想进行垃圾回收,得先知道什么样的对象是垃圾。引用计数法     循环引用对于某个对象而言,只要应用程序中持有该对象的引用,就说明该对象不是垃圾,如果一个对象没有任何指针对其引用,它就是垃圾。弊端:如果AB相互持有引用,导致永远不能被回收。 循环引用    内存泄露   -->内存溢出可达性分析/根搜索算法通过GC Root的引用,开始向下寻找,看某个对象是否可达能作为GC Root:类加载器、Thread、虚拟机栈的本...
  • 2024.10.11 | cuithink | 54次围观
    对象的生命周期
    创建阶段(1)为对象分配存储空间(2)开始构造对象(3)从超类到子类对static成员进行初始化(4)超类成员变量按顺序初始化,递归调用超类的构造方法(5)子类成员变量按顺序初始化,子类构造方法调用,并且一旦对象被创建,并被分派给某些变量赋值,这个对象的状态就切换到了应用阶段应用阶段(1)系统至少维护着对象的一个强引用(Strong Reference)(2)所有对该对象的引用全部是强引用(除非我们显式地使用了:软引用(Soft Reference)、弱引用(Weak Ref...
  • 2024.10.11 | cuithink | 43次围观
    jvm 内存分布图
    jvm 内存共分为5个部分:方法区,堆区(最大内存块),本地方法栈,Java虚拟机栈,程序计数器。方法区和堆区是所有线程公用的。每个Java虚拟机栈由多个栈帧组成,每个栈帧就是一个方法,每个栈帧包括5个内容:操作数栈,局部变量表,动态链接,返回地址,附加信息,其中,后三项又叫做栈帧信息。//堆中元素指向方法区(方法区中会存放静态变量,常量等数据): private static Object obj=new Object();...
  • 2024.10.11 | cuithink | 88次围观
    类加载器有哪些
    类加载器ClassLoader在装载(Load)阶段,其中第(1)步:通过类的全限定名获取其定义的二进制字节流,需要借助类装载器完成,顾名思义,就是用来装载Class文件的。图解:1)Bootstrap ClassLoader 负责加载 JAVA_HOME中 jre/lib/rt.jar 里所有的class或Xbootclassoath选项指定的jar包。由C++实现,不是ClassLoader子类。2)Extension ClassLoader 负责加载java平台中扩展功...
  • 2024.10.11 | cuithink | 64次围观
    ConcurrentHashMap
    1. ConcurrenHashMap存储结构?HashMap和ConcurrenHashMap在存储结构上是一模一样的。数组 + 链表 + 红黑树。存储结构 红黑树出现的原因 链表何时转换为红黑树 为什么链表长度为8才转红黑树 红黑树结构情况下,如果删除元素,导致红黑树元素个数小于等于6,会退化为链表。数组扩容触发的两种情况2. ConcurrentHashMap保证写操作线程安全的方式数组上扔数据,CAS保证安全。 没有哈希冲突的情况。链表/红黑树扔数据,synchron...
  • 2024.10.11 | cuithink | 78次围观
    ReentrantLock解析
    AQS概述AQS就是AbstractQueuedSynchronizer抽象类,AQS其实就是JUC包下的一个基类,JUC下的很多内容都是基于AQS实现了部分功能,比如ReentrantLock,ThreadPoolExecutor,阻塞队列,CountDownLatch,Semaphore,CyclicBarrier等等都是基于AQS实现。首先AQS中提供了一个由volatile修饰,并且采用CAS方式修改的int类型的state变量。其次AQS中维护了一个双向链表,有he...
  • 2024.10.11 | cuithink | 10次围观
    ReentrantLock和synchronized的区别
    核心区别:ReentrantLock是个类,synchronized是关键字,当然都是在JVM层面实现互斥锁的方式效率区别:如果竞争比较激烈,推荐ReentrantLock去实现,不存在锁升级概念。而synchronized是存在锁升级概念的,如果升级到重量级锁,是不存在锁降级的。底层实现区别:实现原理是不一样,ReentrantLock基于AQS实现的,synchronized是基于ObjectMonitor功能向的区别:ReentrantLock的功能比synchroni...