随笔分类 -  JVM

摘要:jvm命令 jps 显示虚拟机进程 jstat (JVM statistics Monitoring)是用于监视虚拟机运行时状态信息的命令。 jstat -gc 查看GC情况 常用命令 jmap(JVM Memory Map)命令用于生成heap dump文件 jmap -dump:live,for 阅读全文
posted @ 2021-04-22 23:53 i%2 阅读(162) 评论(0) 推荐(0)
摘要:跨代引用 老年代对象引用新生代或新生代引用老年代。 解决办法:记忆集。 HotSpot记忆集的实现方式是卡表,维护一张卡表(Remember Set),类似一个字节数组,每个元素都会存放卡页地址,卡页中存放一个或多个对象,若这些对象存在跨代引用,标记为1,下次GC时,就查(CARD_TABLE[th 阅读全文
posted @ 2021-04-22 23:50 i%2 阅读(149) 评论(0) 推荐(0)
摘要:虚拟机参数:方法区、栈大小设置 通过JVM启动参数来配置以上内存空间 Heap(堆)内存大小设置 -Xms512m 设置JVM堆初始内存为512M -Xmx1g 设置JVM堆最大可用内存为1G Stack(栈)内存大小设置 -Xss1m Permanent Generation(持久代/方法区)内存 阅读全文
posted @ 2021-04-22 23:49 i%2 阅读(171) 评论(0) 推荐(0)
摘要:JVM的安全点 有两种查找 GC Roots 的方法: 遍历方法区和栈区查找(保守式 GC) OopMap 数据结构来记录 GC Roots 的位置(准确式 GC) 对应 OopMap 的位置即可作为一个安全点(Safe Point)。安全点意味着在这个点时,所有工作线程的状态是确定的,JVM 就可 阅读全文
posted @ 2021-04-22 23:47 i%2 阅读(221) 评论(0) 推荐(0)
摘要:minor gc如果运行的很频繁,可能是什么原因引起的 1、 产生了太多朝生夕灭的对象导致需要频繁minor gc 2、 新生代空间设置的比较小 minor gc如果运行的很慢,可能是什么原因引起的? 1、 新生代空间设置过大。 2、 对象引用链较长,进行可达性分析时间较长。 3、 新生代survi 阅读全文
posted @ 2021-04-22 23:45 i%2 阅读(159) 评论(0) 推荐(0)
摘要:JVM对象的分配原则 对象优先分配到Eden Space区 大对象直接进入老年代 长期存活对象进入老年代 动态年龄判定 空间分配担保。如果Survivor区域不够容纳对象,则老年代进行空间担保,下一轮GC直接进入老年代。担保失败就FULL GC。 阅读全文
posted @ 2021-04-22 23:44 i%2 阅读(51) 评论(0) 推荐(0)
摘要:垃圾回收触发条件 当Eden区和From Survivor区满时; 调用System.gc时,系统建议执行Full GC,但是不必然执行 老年代空间不足 方法区空间不足 通过Minor GC后进入老年代的平均大小大于老年代的可用内存 哪些对象可以作为 GC Root ? 虚拟机栈(栈帧中的本地变量表 阅读全文
posted @ 2021-04-22 23:42 i%2 阅读(84) 评论(0) 推荐(0)
摘要:对象头里有啥 MarkWord 锁状态 25bit 4bit 1bit 2bit 23bit 2bit 是否偏向锁 锁标志位 无锁 对象的HashCode 分代年龄 0 01 偏向锁 线程ID Epoch 分代年龄 1 01 轻量级锁 指向栈中锁记录 的 指 针 00 重量级锁 指向重量级锁 的 指 阅读全文
posted @ 2021-04-22 23:40 i%2 阅读(47) 评论(0) 推荐(0)
摘要:大对象直接进入老年代?GC规则?新生、老年比例? ​ 对于parnew和serial来说,大于-XX PretenureSizeThreshold就会直接进入老年区,默认是4M。 ​ GC规则:当老年代剩余连续大小大于之前晋升老年代的平均大小,就会minorGC,否则fullGC ​ 比例:新1:老 阅读全文
posted @ 2021-04-22 23:39 i%2 阅读(68) 评论(0) 推荐(0)
摘要:ClassLoader 作用是动态加载class进内存。java中的class并不是一次性全部加载进内存的,而是根据需要动态加载的。通过类加载机制(ClassLoader)动态加载class进内存。 除了BootStrap ClassLoader,其他所有ClassLoader都必须继承自java. 阅读全文
posted @ 2021-04-22 23:36 i%2 阅读(75) 评论(0) 推荐(0)
摘要:类的加载、 类加载器子系统 字节码生成(javac 命令,.java->.class),简单编译原理,词法分析、语法分析、语义分析和中间代码生成、优化、目标代码生成 加载 class二进制流字节码读取进方法区,在内存中生成一个java.lang.Class代表该对象作为访问入口 验证 文件格式验证: 阅读全文
posted @ 2021-04-22 23:35 i%2 阅读(52) 评论(0) 推荐(0)
摘要:常量池 在Class文件结构中,最头的4个字节用于存储魔数Magic Number(0xCAFEBABE:咖啡宝贝),用于确定一个文件是否能被JVM接受,再接着4个字节用于存储版本号,前2个字节存储次版本号,后2个存储主版本号,再接着是用于存放常量的常量池,用于存放编译期生成的各种字面量和符号引用, 阅读全文
posted @ 2021-04-22 23:33 i%2 阅读(78) 评论(0) 推荐(0)
摘要:jvm内存模型 虚拟机栈 栈优化:默认为1M,(-Xss) 线程私有、生命周期同线程,每个方法运行都对应帧栈的建立及在虚拟机栈的入栈出栈过程。 局部变量表 非静态方法会在index[0]存该方法的实例引用(4字节),随后存放方法参数和局部变量(须显示初始化)。 操作栈 桶式结构栈,被各种指令写入和提 阅读全文
posted @ 2021-04-22 23:31 i%2 阅读(61) 评论(0) 推荐(0)
摘要:JMM(java memory model) 是什么 ​ JAVA是多线程的,每个线程操作的是自己的工作内存,线程不能直接操作主内存。由JMM通过LOAD/STORE操作在主内存之间传递值。主内存里放的是所有变量如实例、静态变量等。好处是屏蔽了不同厂商操作系统、硬件内存访问细节,能达到多平台兼容的效 阅读全文
posted @ 2021-04-22 23:30 i%2 阅读(64) 评论(0) 推荐(0)
摘要:垃圾回收(GC) JVM会对内存区域进行定期的检查,当运行到线程安全点的时候启动垃圾回收器,根据垃圾回收机制对内存区域进行内存回收。 为什么要有GC? 内存处理是编程人员最容易出现问题的地方,一旦稍有疏忽忘记回收内存就可能出现内存不足或系统卡顿、不稳定甚至崩溃的现象,造成严重的经济损失。所以可以交给 阅读全文
posted @ 2021-04-22 23:28 i%2 阅读(95) 评论(0) 推荐(0)