JVM
文章平均质量分 79
努力的布布
好好运动、好好学习、好好玩、好好吃、好好休息
展开
-
JVM-垃圾回收算法CMS和G1
前景回顾堆内存逻辑分区 Eden区,survivor区 old区除Epsilon ZGC Shenandoah之外的GC都是使用逻辑分代模型G1是逻辑分代,物理不分代除此之外不仅逻辑分代,而且物理分代标记清除会产生碎片 下次分配大对象会内存不够然后触发GC复制收集算法不适用于对象存活较多情况 存活较多 复制来复制去的对象太多比较慢整理是将存活的向另一端移动 清理掉边界以外的内存Young区对象是刚new的时候放young区 所以存活的少很多都不被引用了 所以可以原创 2022-04-17 11:20:31 · 1000 阅读 · 0 评论 -
JVM-案例汇总
案例汇总OOM产生的原因多种多样,有些程序未必产生OOM,不断FGC(CPU飙高,但内存回收特别少) (上面案例)硬件升级系统反而卡顿的问题(见上)线程池不当运用产生OOM问题(见上) 不断的往List里加对象(实在太LOW)tomcat http-header-size过大问题(Hector)lambda表达式导致方法区溢出问题(MethodArea / Perm Metaspace) LambdaGC.java -XX:MaxMetaspaceSize=9M -XX:+PrintGCDeta原创 2022-04-16 15:31:09 · 523 阅读 · 1 评论 -
JVM-调优《常见可视化工具与命令行的使用》
1.JVM调优第一步,了解JVM常用命令行参数JVM的命令行参数参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.htmlHotSpot参数分类标准: - 开头,所有的HotSpot都支持非标准:-X 开头,特定版本HotSpot支持特定命令不稳定:-XX 开头,下个版本可能取消java -versionjava -X试验用程序:import java.util.List;import jav原创 2022-04-14 21:29:52 · 895 阅读 · 0 评论 -
JVM-垃圾回收
1.1 引用计数法对于某个对象而言,只要应用程序中持有该对象的引用,就说明该对象不是垃圾,如果一个对象没有任何指针对其引用,它就是垃圾。弊端 :如果AB相互持有引用,导致永远不能被回收。1.2 可达性分析通过GC Root的对象,开始向下寻找,看某个对象是否可达能作为GC Root:类加载器、Thread、虚拟机栈的本地的变量等。虚拟机栈(栈帧中的本地变量表)中引用的对象。方法区中类静态属性引用的对象。方法区中常量引用的对象。本地方法栈中JNI(即一般说的Native方法)引用的对原创 2022-04-10 20:37:31 · 1160 阅读 · 0 评论 -
JVM-指令集
1.bipush指令当int取值-128~127时,JVM采用bipush指令将常量压入栈中2.sipush指令当int取值-32768~32767时,JVM采用sipush指令将常量压入栈中。3.ldc指令当int取值-2147483648~2147483647时,JVM采用ldc指令将常量压入栈中。4.两个int类型相加指令iadd本地变量表:0 this1 a2 b3 ciload将a,b压栈iadd将a和b相加istore将结果指向变量表c5.调用引用类型的方法原创 2022-04-05 22:25:42 · 1490 阅读 · 0 评论 -
JVM-方法在栈上的执行过程详解i++和++i
一个线程对应一个操作数栈,一个方法对应一个栈帧。一个栈帧的组成部分有:本地变量表;操作数栈;动态链接;方法出口;本地变量表存储方法的变量,类成员方法第一个参数是this;每次方法执行都有入栈和出栈1.i++和++i1. ++i本地变量表:0:args;1:变量i0 bipush 8 8入栈2 istore_1 8出栈赋值到本地变量表下标为1变量 int i=8结束3 iinc 1 by 1 本地变量表下标为1变量加一操作i等于96 iload_1 本地变量表下标为1变量i原创 2022-04-05 15:03:09 · 475 阅读 · 0 评论 -
JVM-运行时数据区
运行时数据区运行的时候在内存里是一种什么情况原创 2022-03-30 21:08:28 · 1271 阅读 · 0 评论 -
JVM-对象创建,在内存中存储布局,对象头包含的东西
1、对象的创建过程class字节码加载过程new对象过程创建对象然后需要申请内存,成员变量在赋默认值,然后调用构造方法在字节码层面,调用构造方法时候,把成员变量设为初始值,接下来调用构造方法语句super调用父类。观察虚拟机的配置:java -XX:+PrintCommandLineFlags -version2、对象布局作为对象的内存布局来讲分为两种,第一种叫普通对象,第二种叫数组对象。普通对象1:第一是对象头,在hotport里面称为markword 长度是8个字节2:第二个是Cl原创 2022-03-23 21:26:06 · 348 阅读 · 0 评论 -
JVM-JMM硬件层数据一致性 Volicate和synchronized实现细节
1.存储器的层级次结构1.L3在主板所有cpu共享,L1 L2 寄存器在计算机cpu内部, L3L4 L5 L6的数据被加载到不同的cpu 不同CPU赋值不一样,造成不一致性。解决:总线锁 同一时刻只有一个线程CPU可以访问,一个cpu使用变量不会被其他的改变。从下往上,成本越来越高,读取速度也越来越贵。2.cache line的概念 缓存行对齐 伪共享读取缓存以cache line为基本单位,目前64byte位于同一缓存行的两个不同数据,被两个不同CPU锁定,产生互相影响的伪共享问题,解决方法原创 2022-03-23 20:49:01 · 451 阅读 · 0 评论 -
JVM-类生命周期,类加载器和双亲委派
1.Class Cycle java类的生命周期Class Loading Linking initializingGC 是垃圾回收,表示结束了。静态变量是在类加载的时候执行的,所以静态Static修饰的,加载一次就初始化一次,所以是单例模式的。2.类加载器自下向上分别是加载器的父类加载器关系,每个加载器都有自己的内存。为了安全机制所以有双亲委派 防止自己定义java有的类 在加载的时候代替JDK提供的类。不同的类处于不同的位置在jdk里,有不同的类加载器进行装载,jvm按需动态加载,采用双原创 2022-03-13 22:44:02 · 391 阅读 · 0 评论