JVM

  • 2024.10.11 | cuithink | 81次围观
    对象的内存分配
    对象的内存分配 一般情况下,新创建的对象都会被分配到Eden区,一些特殊的大对象才会被分配到Old区,这是内存担保机制GC的悲观策略: 所有对象的生命周期,98%都是朝生夕死相同年龄的所有对象的大小总和大于S区其中一个区域的一半,则分代年龄大于或等于这个年龄的对象都要进入老年代(图灵讲的是所有年龄的对象综合,年龄1+年龄2+年龄3+年龄4)Full GC=young GC+Old GC+MetaSpace GCJDK1.8 开始MetaSpace用的是直接内存,元空间的GC能...
  • 2024.10.11 | cuithink | 97次围观
    G1垃圾回收器介绍
    初始标记(initial mark,STW):暂停所有的其他线程,并记录下gc roots直接能引用的对象,速度很快 ;并发标记(Concurrent Marking):同CMS的并发标记最终标记(Remark,STW):同CMS的重新标记筛选回收(Cleanup,STW):筛选回收阶段首先对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿G1 设计指导思想是垃圾优先原则,同时还能照顾到停顿时间和吞吐量。G1设计的目的是避免完全回收,但是当并发收集不能够足够...
  • 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 | 23次围观
    垃圾收集算法
    已经能够确定一个对象为垃圾之后,接下来要考虑的就是回收,怎么回收呢?得要有对应的算法,下面介绍常见的垃圾回收算法。高效   健壮标记-清除(Mark-Sweep)标记找出内存中所有的存活对象,并且把它们标记出来清除清除掉被标记需要回收的对象,释放出对应的内存空间缺点标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程 序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。 (1)标记和清除两个过程都比较耗时,...
  • 2024.10.11 | cuithink | 37次围观
    如何确定一个对象是垃圾
    要想进行垃圾回收,得先知道什么样的对象是垃圾。引用计数法     循环引用对于某个对象而言,只要应用程序中持有该对象的引用,就说明该对象不是垃圾,如果一个对象没有任何指针对其引用,它就是垃圾。弊端:如果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平台中扩展功...
1