jvm那些事
文章平均质量分 64
JYYabc
一名双非二本小透明
展开
-
JVM中的CMS收集器
CMS收集器CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器;这款收集器是HotSpot虚拟机中第一款真正意义上支持并发的垃圾收集器,首次实现了让垃圾收集线程与用户线程(基本上)同时工作。适用于:互联网网站或者基于浏览器的B/S系统的服务端基于标记-清除算法实现的,具体步骤分为4步:1.初始标记:Stop The World -> 标记一下GC Roots能直接关联到的对象,速度很快2.并发标记:从GC Roots的直接关联对象开始遍原创 2022-12-13 11:59:47 · 204 阅读 · 0 评论 -
垃圾回收算法
垃圾收集算法标记-清除标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象,也可以反过来,标记存活的对象,回收未标记的对象。后续的收集算法大多都是以此为基础,对其缺点做优化。缺点:1.执行效率不稳定如果java堆中的对象过多,导致标记和清除两个过程的执行效率都随对象数量增长而降低;2.内存空间的碎片化问题标记、清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致当以后在程序运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集原创 2022-12-13 11:45:47 · 80 阅读 · 0 评论 -
JVM中对象的四种引用关系
### 四种引用#### 强引用无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象,使用 new 一个新对象的方式来创建强引用。```javaObject obj = new Object();```#### 软引用软引用是用来描述一些还有用,但非必须的对象。只被软引用关联着的对象,在系统**将要发生内存溢出异常前**,会把这些对象列进回收范围之中**进行第二次回收**,如果这次回收还没有足够的内存, 才会抛出内存溢出异常。在JDK 1.2版之后提供了S原创 2022-12-12 11:47:03 · 79 阅读 · 0 评论 -
如何判断对象生死?什么时候宣告对象死亡?
在对象中添加计数器,引用一次+1,有个引用销毁就-1;直到计数器中的数值为0,该对象死亡。优点:实现简单,效率很高缺点:会出现循环引用问题,不好处理(对象A引用对象B,对象B引用对象A,AB的计数器永远不会是0,AB永远不会被回收) GCroot根对象作为起始节点集,按照引用关系向下搜索,搜索过程中所走的路径为引用链;如果一个对象和GCroot之间没有任何一条引用链,即该对象死亡。哪些可以作为GCRoot?在虚拟机栈中引用的对象:各个线程被调用的方法堆栈中使用到的 参数、局部变量、临时变量等方法区中类原创 2022-12-07 16:47:11 · 229 阅读 · 0 评论 -
JVM内存分布策略及在堆中的布局
顺序分配,分配与未分配之间添加一个指针,每次分配时,指针往后移动需要的空间即可优点:操作简单缺点:要求堆空间要规整;多线程下效率不高按需分配,需要一张表记录分配情况优点:需要一个列表做存储缺点:产生了空间碎片问题,大对象存入时会出现无连续空间问题在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:2.1.1 Mark Word存储对象自身的运行时数据:哈 希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。使用Mark Word(一个有着动态定义的原创 2022-12-07 16:34:34 · 173 阅读 · 0 评论 -
JVM运行时数据区域
所谓的JVM运行时数据区域,就是JVM数据部分每块存的都是什么?下面就来详细说说主要分为两大部分,线程之间共享和线程独有。存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。JDK 7的HotSpot,已经把原本放在永久代的字符串常量池、静态变量等移出,而到了JDK 8,终于完全废弃了永久代的概念,改用与JRockit、J9一样在本地内存中实现的元空间。Java堆(Java Heap)是虚拟机所管理的内存中最大的一块。此内存区域的唯一目的就是存放对象实例。Java堆是垃圾收集器管原创 2022-12-07 15:13:48 · 87 阅读 · 0 评论 -
0基础-JVM对象内存布局
对象内存布局存储对象分为三部分: 1. 对象头Mark Word是一个有着动态定义的数据结构,前面的标志位不同,表示着不同的状态。Java虚拟机通过这个指针来确定该对象是哪个类的实例。如果对象是个java数组,对象头中还需要有一块用于记录数组长度的数据,对象是数组对象头有3样东西,其他都是2样。 2. 实例数据对象a中的全部信息,private int id; 3. 对齐填充这并不是必然存在的,也没有特别的含义,它仅仅起着占位符的作 用。由于HotS原创 2022-10-08 22:23:06 · 126 阅读 · 0 评论 -
0基础-JVM运行时数据区域详解
本地方法栈与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native) 方法服务。举个例子:给一个绳上绑一个计数器,记录每根绳子跳的次数,绳之间互不影响,也不会造成内存溢出。此内存区域的唯一目的就是存放对象实例,Java 世界里“几乎”所有的对象实例都在这里分配内存。对象引用类型,不是指对象本身,可能是指向对象起始地址的引用指针。的数据会占用两个变量槽,其余的数据类型只占用一个。,更多情况下指的是虚拟机栈中的。原创 2022-10-08 22:05:28 · 154 阅读 · 0 评论 -
JVM内存分配策略及并发安全性考虑
(顺序分配,分配一块,接着分配下一块,分配过和未分配的中间有个指针,每次要分配时向后挪动指针,这一块块都是挨着的)采用哪个方法取决于java堆是否规整,如果都是紧挨着的采用指针碰撞,如果分配区中包含未分配的空间,则使用空闲列表。(按需分配,分配连续空间,分配的空间不一定是挨着的,中间可能会隔着,使用一个列表记录分配情况)创建了一个Student的对象,为他分配空间,jvm又是如何分配呢?1.检查类是否存在,是否被加载,如果没有,先进行类加载。1.CAS配上失败重试。要求空间一定是规整的。原创 2022-10-08 21:22:20 · 321 阅读 · 0 评论