JVM原理
文章平均质量分 70
一只狮
没有最好的路,只有你能走最远的路。
展开
-
【JVM】CMS、G1
G1基本概念card table:由于在做ygc的时候,需要找到哪些对象需要回收,那就可能需要遍历全部的old区,才能找到需要回收的对象,效率低。所以jvm设置了card table.对eden区和old区,每几个对象分为一个card。如果一个card里面有一个对象的引用指向Y区,则将card设置为dirty。再次扫描只需要扫描dirty的card。在结构上,用bitmap保存。 CSet=collection set。一组可被回收的分区的集合。把需要回收的region,都集合起来,叫做colle原创 2021-06-13 19:06:36 · 80 阅读 · 0 评论 -
【JVM】调优
区分概念:内存泄漏 memory leak。内存被无用对象占用,不一定会移除 内存yi原创 2021-06-10 22:55:45 · 1067 阅读 · 0 评论 -
【jvm】垃圾回收
GC常用算法Mark-Sweep 标记清除算法相对简单 在存活对象比较多的时候效率高 扫描两遍,效率低(第一遍标记,第二遍清除) 容易产生碎片Copying 拷贝把内存一分为二,把a部分的存活对象依次移动到b部分中,再清除a的全部适用于存活对象较少的时候 只扫描一次,效率高 没有碎片 空间浪费 移动复制对象,需要调整对象引用Mark-Compact 标记压缩不会产生碎片,方便对象分配 不会产生内存减半 扫描两次 需要移动对象,效率较低JVM内存分代模型(用于分代原创 2021-06-08 22:56:48 · 346 阅读 · 0 评论 -
【JVM】java runtime data area. 和jvm instructions
java runtime data areapc program counter 程序计数器:存放指令位置(下标)。 虚拟机的运行:取pc中的位置,找到该位置对应的指令,执行指令,pc++ heap堆 jvm stacks ,每一个线程对应的栈,每个方法对应一个栈帧frame native methodstacks direct memory 直接内存,jvm可以直接访问操作系统的内存。nio中 提高效率,实现zero copy method area ,jvm共享,存class结构..原创 2021-06-06 21:59:55 · 135 阅读 · 1 评论 -
【JVM】对象内存布局面试题
对象在内存中的存储布局普通对象8位的对象头 markword classpointer指针指向class文件的地址。 实例数据。 按8的倍数对齐数组对象对象头 markword classpointer 数组长度 4字节 数组数据 按8的倍数对齐对象头的结构32位解释∫对象怎么定位句柄池。对象引用指向句柄池,句柄池包含2个指针,一个指向对象,一个指向.class文件 直接指针。对象引用直接指向new的对象,对象中的classpointer指向.class文原创 2021-06-06 18:08:48 · 84 阅读 · 0 评论 -
【JVM】JMM/ java内存模型
硬件层的并发优化基础知识数据层一致协议每个cpu有内部的高速缓存区,也有外部的高速缓存或者内存。当一个数据在外部高速缓存或者内存中,当cpu要处理数据的时候,会先查内部高速缓存,再查外部高速缓存,再查内存,将数据拿回来处理,那么多个cpu同时处理一个数据,如何保证数据一致性?在老的cpu中,会对总线加锁,这样效率很低。所以在新的cpu中,会使用各种各样的数据层一致协议,因特尔使用的MESI协议,还有各种其他协议MESI协议MESI缓存锁。内存中保存对象的4个状态,通过4个状态来保证数据一原创 2021-06-06 17:11:40 · 94 阅读 · 4 评论 -
【JVM】基础概念点
类加载过程load:把硬盘上的class文件,加载到内存中 link 校验 准备:把静态变量赋默认值 resolution:内存中对象的符号引用转换为直接应用 init:把静态变量赋初始值类加载器lib包中的基础类由classLoader加载 ext包中的类由extClassLoader加载 应用中的类由applicationClassLoader加载 还可以自定义类加载器以上按顺序加载。是属于子加载器与类加载器的关系,注意在语法上不是继承关系。classL...原创 2021-06-03 22:38:19 · 68 阅读 · 0 评论 -
JVM虚拟机之类加载--关于接口加载的不同见解
首先是书上 或者各种资料上有这样一段话,但是个人认为有问题,接口加载应该与类加载的规则一致,即: 初始化一个类 时,会先初始化它所实现的接口解析如下: 因为接口中定义静态变量,默认 属性为public static final, 若在接口类中定义常量,则 在加载时,会 将常量存入 加载的类的运行时的数据区的方法区内,导致不会初始化接口。可以按一下步骤进行测...原创 2019-11-24 22:18:14 · 173 阅读 · 1 评论