![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
文章平均质量分 58
HeloJ
这个作者很懒,什么都没留下…
展开
-
内存溢出、泄漏
1. 内存泄漏程序无法释放已申请的内存空间1.1 声明静态的集合类如:private static Map<String> map = new HashMap();它们的生命周期与应用程序的生命周期相同,容易导致OOM。1.2 ThreadLocal未主动removeThreadLocal使用弱引用作为key,当ThreadLocal不存在外部强引用时,key会被GC回收,就导致key为null,value还存在强引用,只有在线程结束时,value的强引用才会断掉1.原创 2021-05-09 16:43:00 · 89 阅读 · 0 评论 -
垃圾收集器
1. Serial收集器是一个单线程垃圾收集器,垃圾收集过程过程中会STW,新生代使用标记-复制算法,老年代使用标记-整理算法。启动参数:-XX:+/-UseSerialGC,可应用于客户端模式下虚拟机。2. ParNew收集器Serial收集器的多线程版本,能与CMS收集器配合工作。老年代使用CMS后(-XX:+/-UseConcMarkSweepGC),新生代模式使用ParNew。启动参数:-XX:+/-UseParNewGC(JDK9取消),默认开启收集线程数...原创 2021-05-09 16:42:12 · 77 阅读 · 0 评论 -
HotSpot算法细节
1. 根节点枚举类加载完成后,HotSpot使用一组OopMap数据结构来记录对象内对应偏移量上对应的数据类型,在即时编译过程中,也会在特定位置记录下栈里和寄存器里哪些位置是引用。这样,垃圾收集器在进行GC Roots扫描时就不要从方法区等GC Roots开始查找,优化引用链构建效率。OopMap会带来其他问题:如果每条指令都生成OopMap将需要大量额外的空间,此时引出了安全点。2. 安全点安全点主要针对程序获取CPU时间片,执行进行垃圾收集的情况。HotSpot只在安全点位置才会生成原创 2021-05-09 16:39:04 · 264 阅读 · 0 评论 -
垃圾收集算法
1. 分代收集理论分代收集理论建立在两个分代假说之上:弱分代假说:绝大多数对象都是朝生夕灭的。 强分代假说:熬过越多次垃圾收集过程的对象就越难以消亡。2. 标记-清除算法最基础的垃圾收集算法,分为标记和清除两个阶段标记出所有需要回收的对象 标记完成后,统一回收掉所有被标记的对象此算法主要缺点有两个:执行效率不稳定 如果Java堆中包含大量需回收的对象,标记和清除的执行效率将降低 内存空间碎片化 清除之后产生大量不连续的内存碎片,导致后期分配较大对象时无法找到足够内原创 2021-05-09 16:38:00 · 57 阅读 · 0 评论 -
对象存活判定
1. 引用计数算法在对象中添加一个引用计数器,每当有一个地方引用它时,计数器就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。缺点:无法解决对象之间相互循环引用的问题2. 可达性分析算法从GC Roots到对象不可达时,则此对象不可能再被使用GCRoots对象:虚拟机栈中引用的对象,如:各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量等 方法区中类静态属性引用的对象,如:Java类的引用类型静态变量 方法区中常量引用的对象,原创 2021-05-09 16:35:59 · 84 阅读 · 0 评论 -
对象访问定位
Java程序会通过栈帧中的reference数据来操作堆上的具体对象,主流的对象访问方式有两种:使用句柄访问 直接指针访问1. 使用句柄Java堆中可能会划分处一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄包含了对象实例数据与类型数据各自具体的地址信息。优点:对象被移动时只会改变句柄中实例数据指针,reference本身无需更改2. 直接指针reference中存储对象地址,HotSpot使用此种访问方式优点:访问速度快,节省一次指针定位的时间原创 2021-05-09 16:34:52 · 49 阅读 · 0 评论 -
对象内存布局
在HotSpot虚拟机中,对象在堆内存中的存储布局可以划分为三个部分:对象头 实例数据 对齐填充1. 对象头对象头包含一般包含两类信息,数组对象包含三类信息1.1 存储对象自身的运行时数据(Mark Word)如:哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向锁ID、偏向时间戳等1.2 类型指针(Klass)类型指针指对象指向它的类型元数据的指针,Java虚拟机通过这个指针来确定该对象是哪个类的实例。1.3 数组长度仅数组对象包含,主要用来虚拟机通过普通Jav原创 2021-05-09 16:34:12 · 59 阅读 · 0 评论 -
对象创建流程
原创 2021-05-09 16:32:44 · 49 阅读 · 0 评论 -
内存模型
1. 程序计数器程序计数器是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。各条线程之间程序计数器互不影响,独立存储,即:线程私有。如果执行一个Java方法,程序计数器记录正在执行的虚拟机字节码指令的地址;如果执行一个Native方法,程序计数器记录为空(Undefined)。《Java虚拟机规范》未对此内存区域规定任何OOM情况。2. Java虚拟机栈Java虚拟机栈是线程私有的,生命周期与线程相同。虚拟机栈描述的是Java方法执行的线程内存模型:每个..原创 2021-05-09 16:29:19 · 62 阅读 · 0 评论