![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
jvm
文章平均质量分 63
编程界——周大神
这个作者很懒,什么都没留下…
展开
-
JVM之内存结构
jvm内存结构1. 程序计数器(寄存器)作用:记住下一条指令的地址特点:线程私有不会内存溢出2. 虚拟机栈1.每个方法执行都会形成一个栈帧进栈,并且每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法2.虚拟机栈是由一个个栈帧组成,而每个栈帧中都拥有:局部变量表、操作数栈、动态链接、方法出口信息。3.问题辨析垃圾回收是否涉及栈内存?栈内存分配越大越好吗?方法内的局部变量是否线程安全?如果方法内局部变量没有逃离方法的作用访问,它是线程安全的如果是局部变量引用了对象,并逃离方法原创 2020-11-12 09:58:39 · 173 阅读 · 0 评论 -
JVM之JMM
Java内存模型CAS 与 原子类CASCAS 即 Compare and Swap ,它体现的一种乐观锁的思想,比如多个线程要对一个共享的整型变量执行 +1 操作:获取共享变量时,为了保证该变量的可见性,需要使用 volatile 修饰。结合 CAS 和 volatile 可以实现无锁并发,适用于竞争不激烈、多核 CPU 的场景下。1)因为没有使用 synchronized,所以线程不会陷入阻塞,这是效率提升的因素之一2)但如果竞争激烈,可以想到重试必然频繁发生,反而效率会受影响CAS 底原创 2021-01-17 10:27:51 · 97 阅读 · 0 评论 -
JVM之JMM
Java内存模型java 内存模型java 内存模型简单的说,JMM 定义了一套在多线程读写共享数据时(成员变量、数组)时,对数据的可见性、有序性、和原子性的规则和保障原子性问题提出,两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果是 0 吗?问题分析以上的结果可能是正数、负数、零。为什么呢?因为 Java 中对静态变量的自增,自减并不是原子操作。例如对于 i++ 而言(i 为静态变量),实际会产生如下的 JVM 字节码指令:而对应 i-- 也是类似:原创 2021-01-12 23:52:05 · 201 阅读 · 2 评论 -
JVM之类加载
运行期优化即时编译分层编译原因是什么呢?JVM 将执行状态分成了 5 个层次:0 层,解释执行(Interpreter)1 层,使用 C1 即时编译器编译执行(不带 profiling)2 层,使用 C1 即时编译器编译执行(带基本的 profiling)3 层,使用 C1 即时编译器编译执行(带完全的 profiling)4 层,使用 C2 即时编译器编译执行profiling 是指在运行过程中收集一些程序执行状态的数据,例如【方法的调用次数】,【循环的回边次数】等即时编原创 2021-01-11 18:22:50 · 76 阅读 · 0 评论 -
JVM之类加载
类加载器有层级关系,首先会问问上级是否加载过了(逐层),最后才轮到自定义加载器启动类加载器用 Bootstrap 类加载器加载类:执行输出1)-Xbootclasspath 表示设置 bootclasspath2)其中 /a:. 表示将当前目录追加至 bootclasspath 之后3)可以用这个办法替换核心类java -Xbootclasspath:java -Xbootclasspath/a:<追加路径>java -Xbootclasspath/p:<原创 2021-01-11 16:24:56 · 74 阅读 · 0 评论 -
JVM之类加载
类加载阶段加载将类的字节码载入方法区中,内部采用 C++ 的 instanceKlass 描述 java 类,它的重要 field 有:1)_java_mirror 即 java 的类镜像,例如对 String 来说,就是 String.class,作用是把 klass 暴露给 java 使用2)_super 即父类_fields 即成员变量3)_methods 即方法4)_constants 即常量池5)_class_loader 即类加载器6)_vtable 虚方法表7)_itabl原创 2021-01-10 23:52:41 · 76 阅读 · 0 评论 -
JVM之类加载
语法糖默认构造器编译成class文件的代码自动拆装箱这段代码在 JDK 5 之前是无法编译通过的,必须改写为泛型集合取值泛型也是在 JDK 5 开始加入的特性,但 java 在编译泛型代码后会执行 泛型擦除 的动作,即泛型信息在编译为字节码之后就丢失了,实际的类型都当做了 Object 类型来处理:所以在取值时,编译器真正生成的字节码中,还要额外做一个类型转换的操作:如果前面的 x 变量类型修改为 int 基本类型那么最终生成的字节码是:还好这些麻烦事都不用自己做。擦除的是字原创 2021-01-09 13:13:42 · 55 阅读 · 1 评论 -
JVM之类加载
字节码技术之 synchronized注意方法级别的 synchronized 不会在字节码指令中有所体现原创 2021-01-07 12:08:47 · 50 阅读 · 0 评论 -
JVM之类加载
字节码技术之异常处理try-catch1)可以看到多出来一个 Exception table 的结构,[from, to) 是前闭后开的检测范围,一旦这个范围内的字节码执行出现异常,则通过 type 匹配异常类型,如果一致,进入 target 所指示行号2)8 行的字节码指令 astore_2 是将异常对象引用存入局部变量表的 slot 2 位置多个 single-catch 块的情况因为异常出现时,只能进入 Exception table 中一个分支,所以局部变量表 slot 2 位原创 2021-01-07 11:27:51 · 51 阅读 · 0 评论 -
JVM之类加载
字节码指令之条件判断指令条件判断指令表几点说明:1)byte,short,char 都会按 int 比较,因为操作数栈都是 4 字节2)goto 用来进行跳转到指定行号的字节码源码字节码循环控制指令源码字节码for循环源码字节码练习 - 判断结果...原创 2021-01-06 11:22:24 · 58 阅读 · 0 评论 -
JVM之类加载
字节码技术分析a++练习 - 分析 i++目的:从字节码角度分析 a++ 相关题目1)源码2)字节码分析:1.注意 iinc 指令是直接在局部变量 slot 上进行运算2.a++ 和 ++a 的区别是先执行 iload 还是 先执行 iinc...原创 2021-01-06 10:28:05 · 56 阅读 · 0 评论 -
JVM之类加载
字节码指令1.入门接着上一节,研究一下两组字节码指令,一个是public cn.itcast.jvm.t5.HelloWorld(); 构造方法的字节码指令2a => aload_0 加载 slot 0 的局部变量,即 this,做为下面的 invokespecial 构造方法调用的参数b7 => invokespecial 预备调用构造方法,哪个方法呢?00 01 引用常量池中 #1 项,即【 Method java/lang/Object."":V 】b1 表示返回另一个原创 2021-01-05 11:57:57 · 66 阅读 · 0 评论 -
JVM之垃圾回收
垃圾回收1. 如何判断对象可以回收1.1引用计数法描述:如果一个对象被引用一次就加一,反之则减一问题:当A、B俩个对象相互引用时,计数为1,导致不能被垃圾回收1.2可达性分析法描述:要先确定一系列根对象(肯定不能当成垃圾的),在垃圾回收之前,首先会对堆中的堆内存所有对象进行扫描,看看每一个对象是否被根对象直接或间接的引用如果是,那么这个对象就不能被回收,反之就可以作为垃圾将来可以被回收v在这里插入图片1.3四种引用2. 垃圾回收算法2.1标记清除2.2标记整理2.3复制3. 分代原创 2020-11-21 17:21:50 · 174 阅读 · 0 评论 -
JVM之Java内存模型
jvmStringTable 位置如何证明StringTable的位置堆中还是常量池中?描述:通过一段代码分别在不同的jdk下跑,查看具体的报错信息,看是堆空间不足还是永久代空间不足。StringTable 垃圾回收刚开始StringTable里面存在类中字符信息描述将10000个字符放入StringTable中,查看Number of entries的变化,来判断StringTable是否有垃圾回收StringTable 性能调优1、桶个数StringTable底层是原创 2020-11-17 15:08:32 · 93 阅读 · 0 评论