![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
文章平均质量分 69
独上西楼-
纸上得来终觉浅,绝知此事要躬行
展开
-
JVM_字节码指令4_抛出异常指令与异常处理(异常表)
一、抛出异常指令:1)athrow指令在Java程序中显示抛出异常的操作(throw语句)都是由 athrow指令来实现。除了使用throw语句显示抛出异常情况之外,JVN现范还规定了许多运行时异常会在其他]ava虚拟机指令检测到异常状况时自动抛出。例如,在整数运算时,当除数为零时,虚拟机会在idiv或1div指令中抛出ArithmeticException异常。2)注意正常情况下,操作数栈的压入弹出都是一条条指令完成的。唯一的例外情况是在抛异常时,Java虚拟机会清除操作数栈上的所原创 2021-02-20 11:36:17 · 706 阅读 · 0 评论 -
JVM_字节码指令3_比较指令&条件指令
1. 比较指令作用是比较栈顶两个元素的大小,并将比较结果入栈。比较指令有:dcmpg,dcmpl、fcmpg、fcmpl、lcmp首字符d表示double类型,f表示loat,l表示long.指令fcmpg和fcmpl 都从栈中弹出两个操作数,并将它们做比较,设栈顶的元素为v2,栈顶顺位第2位的元素为v1,若v1=v2,则压入0;若v1>v2则压入1:若v1<v2则压入-1。2.条件跳转指令条件跳转指令通常和比较指令结合使用。在条件跳转指令执行前,一般可以先用比较指令进原创 2021-02-18 15:15:26 · 1378 阅读 · 0 评论 -
JVM_字节码指令2_创建指令
一、概述虽然类实例和数组都是对象,但Java虚拟机对类实例和数组的创建与操作使用了不同的字节码指令:1.创建类实例的指令:new·它接收一个操作数,为指向常量池的索引,表示要创建的类型,执行完成后,将对象的引用压入栈2.创建数组的指令:newarray/ anewarray/ multianewarrynewarray: 创建基本类型数组·anewarray:创建引用类型数组multianewarray:创建多维数组上述创建指令可以用于创建对象或者数组,由于对象和数组在ava中的.原创 2021-02-07 18:37:01 · 293 阅读 · 2 评论 -
JVM_字节码指令_算术操作(i++ 与++i)
了解JVM 加载字节码的过程,有助于理解算术操作 i++ 和 ++i的区别函数 字节码指令 说明 private void method1(){ int i = 10; i++;} 0 bipush 10 2 istore_1 3 iinc 1 by 1 6 return 把10从常量池中加载到操作数栈中 操作数栈出栈, 即把10存储到局部变量表中下标为1的位置 局部变量表中...原创 2021-02-02 16:20:16 · 158 阅读 · 1 评论 -
JVM_成员变量的赋值 (类加载)
1. 成员变量(非静态)的赋值过程 默认初始化 (例如int 类型的变量默认值为 0) 显性初始化/代码块中初始化 构造函数中初始化 有了对象后,通过对象的方式进行赋值 (函数或者 object.xx) 2. 代码实例public class ClassLoadingTest { public static void main(String[] args) { System.out.println("main start"); .原创 2021-01-18 14:53:57 · 639 阅读 · 2 评论 -
JVM_内存溢出(Java heap space) 及 GC 日志分析
import java.util.ArrayList;import java.util.List;/** * -XX:MaxHeapSize=10m -XX:InitialHeapSize=10m -XX:+PrintGCDetails */public class GCTest2 { public static void main(String[] args) { System.out.println("main start"); List<.原创 2021-01-05 18:49:33 · 1171 阅读 · 3 评论 -
JVM_对象引用对垃圾回收的影响
以一个例子记录,对象引用对垃圾回收的影响情况。/** * -XX:MaxHeapSize=10m -XX:InitialHeapSize=10m -XX:+PrintGCDetails */public class GCTest { public byte[] bytes = new byte[1024*1000]; // 约1m public static void main(String[] args) { System.out.println("main原创 2021-01-05 17:28:19 · 111 阅读 · 0 评论 -
Java_String 对象笔记
JDK8 及之后的版本, 字符串常量池是在堆中,尽管通过new 关键字创建的对象会保存在堆中,以例子记录。详细说明在注释中,包含字符串拼接(使用了StringTable)、String 的intern() 方法等。最好是查看反编译之后的字节码指令,可以清晰看到执行的过程(尤其是使用 + 进行字符串拼接的时候,会创建一个StringBuilder 对象,并且不会把结果放入字符串常量池中-字节码指令中没有ldc )public class StringTableTest { public原创 2021-01-05 16:08:58 · 72 阅读 · 0 评论 -
JVM_参数测试记录
以一个简单的例子记录JVM 参数的测试/** * 测试堆空间中才用到的jvm蚕食 1. 在Run -> profile -> Edit configuration -> VM Option 配置中的 VM -XX:+PrintFlagsInitial -XX:+PrintFlagsFinal 查看所有参数的默认初始值 和最终值 MaxHeapSize = 130862280 ?? (/1024/1024 =125M? ) InitialHe原创 2020-12-21 16:15:27 · 104 阅读 · 0 评论 -
JVM_局部变量表
public class LocalVariablesTest { private int mCount = 0; public static void main(String[] args) { //因为this 变量不存在于当前方法的局部变量中?? //System.out.println(this.mCount); LocalVariablesTest test = new LocalVariablesTest(); ...原创 2020-12-17 19:56:33 · 463 阅读 · 0 评论 -
JVM_方法(栈帧)的退出方式
以例子理解方法的两种退出方式。方法的结束方法有两种: 1.正常结束,以return为代表 2.方法执行中出现未捕获处理的异常,以抛出异常结束1. 正常结束//方法的结束方法有两种: 1.正常结束,以return为代表 2.方法执行中出现未捕获处理的异常,以抛出异常结束public class StackFrameTest { public static void main(String[] args) { StackFrameTest stackFrameTest.原创 2020-12-17 11:31:51 · 279 阅读 · 1 评论