![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
简说JVM
黑子.
以创业的心态去打工。
展开
-
01 Java 代码是怎么运行的
Java代码运行的方式 1:在开发工具中运行 2:双击 jar 文件运行 3:在命令行中运行 4:在网页中运行 上述运行方式都离不开 JRE,也就是 Java 运行时环境。实际上 JRE 仅包含运行 Java 程序的必须组件,包括 Java 虚拟机以及 Java 核心类库等。Java 程序员经常接触到的 JDK 同样包含了 JRE,并且还附带了一系列开发和诊断工具。 为什么 Java 要在虚拟机里...原创 2019-01-13 22:30:17 · 325 阅读 · 0 评论 -
14 Java虚拟机实现 synchronized
java 中的 synchronized 运行 在 Java 中,我们经常用 synchronized 关键字对程序进行加锁。无论是一个代码块还是静态方法或者实例方法,都可以直接用 synchronized 声明。 当声明 synchronized 代码块时,编译的字节码将包含 monitorenter 和 monitorexit 指令。这两种指令均会消耗操作数栈上的一个引用类型的元素,作为所要加...原创 2019-01-28 18:17:46 · 324 阅读 · 0 评论 -
10 Java 对象的内存布局
Java 创建对象的方式 1:new 语句和反射机制创建。该方式会调用类的构造器,同时满足诸多约束。如果一个类没有构造器的话,Java 编译器会自动添加一个无参数的构造器。子类的构造器需要调用父类的构造器,如果父类存在无参数构造器的话,该调用可以是隐式的。如果父类没有无参数构造器,那么子类的构造器则需要显式的调用父类带参数的构造器。 显式调用又可以分为两种,一种是使用“super”关键字调用父类构...原创 2019-01-23 14:48:30 · 169 阅读 · 0 评论 -
04 JVM是如何执行方法调用的(上)
重载和重写 重载:同一个类中定义名字相同的方法,但是参数类型或者参数个数必须不同。 重载的方法在编译过程中就可完成识别。具体到每一个方法的调用,Java 编译器会根据所传入参数的生命类型来选取重载方法。选取的过程分以下三个阶段: 1:在不考虑对基本类型自动装拆箱,以及可变长参数的情况下选取重载方法。 2:如果第 1 个阶段未找到,那么在允许自动装拆箱,但是不允许可变长参数的情况下选出重载方法。 3...原创 2019-01-18 10:21:24 · 193 阅读 · 0 评论 -
13 Java内存模型
数据竞争 int a=0, b=0; public void method1() { int r2 = a; b = 1; } public void method2() { int r1 = b; a = 2; } 上述代码中,定义了两个共享变量 a 和 b,以及两个方法。在单线程分别调用方法一和方法二后,r1 和 r2 的值可能是(1,0) 或者是(0,2)。如果是在多...原创 2019-01-26 22:30:33 · 217 阅读 · 0 评论 -
07 JVM 是如何实现反射的
Java 中的反射 反射是 Java 语言的一个相当重要的特性,它允许正在运行的 Java 程序观测,甚至是修改程序的动态行为。 我们可以通过 Class 对象枚举该类中的所有方法,还可以通过 Method.SetAccessible 让过 Java 语言的访问权限,在私有方法所在类之外的地方调用该方法。 反射在 Java 中的引用十分广泛。日常我们用的 Java 继承开发工具 IDE 便运用了这...原创 2019-01-21 21:41:41 · 388 阅读 · 0 评论 -
03 Java 虚拟机是如何加载 Java 类的
Java 引用类型 Java 中的引用类型细分为四种:类,接口,数组类和泛型参数。 因为泛型参数会在编译过程中被擦除,所以 Java 虚拟机实际上只有前三种。数组类是由 Java 虚拟机直接生成的,其他两种则有对应的字节流。 无论是数组类还是其他两种类型,Java 虚拟机都需要对其进行链接和初始化。 加载 加载就是查找字节流,然后据此创建类的过程。数组类由 Java 虚拟机直接生成,其他类则需要 ...原创 2019-01-16 22:37:37 · 129 阅读 · 0 评论 -
12 JVM 垃圾回收(下)
Java 虚拟机的堆划分 Java 虚拟机将堆划分为新生代和老年代。其中新生代又被划分为 Eden 区,以及两个大小相同的 Survivor 区。 默认情况下,Java 虚拟机采取一种动态分配的策略,根据对象生成的速率,以及 Survivor 区的使用情况动态调整 Eden 区和 Survivor 区的比例。也可以通过参数 -XX:SurvivorRatio 来固定这个比例。需要注意的是,其中一个...原创 2019-01-25 23:30:23 · 234 阅读 · 0 评论 -
06 JVM 是如何处理异常的
在 JAVA 中,异常处理的方式主要是抛出异常和捕获异常。这两大要素共同实现程序控制流的非正常转移。 抛出异常可以分为显示和隐式两种。显示抛出异常的主体是应用程序,它指的是在程序中使用 throw 关键字,手动将异常实例抛出。隐式抛出异常的主题是 Java 虚拟机,它指的是 Java 虚拟机在执行过程中,碰到无法继续执行的异常状态,自动抛出异常。例如数组越界异常。 捕获异常主要设计一下三种代码块:...原创 2019-01-19 20:51:00 · 706 阅读 · 0 评论 -
02 Java 的基本类型
Java 的基本类型 Java 包括了八种基本类型,明细如下: Java 的基本类型都有对应的值域和默认值。byte,short,int,long,float以及double的值域依次扩大,前面的值域都被后面的值域包括在内。所以,从前面的基本类型转换成后面的基本类型,无需强制转换。补充:尽管它们的默认值表示不一样,但是在内存中都是 0. boolean 和 char 是唯二的无符号类型。bool...原创 2019-01-14 21:21:29 · 204 阅读 · 0 评论 -
04 JVM是如何执行方法调用的(下)
虚方法调用 Java 里所有非私有实例方法调用都会被编译成 invokevirtual 指令,而接口方法调用会被编译成 invokeinterface 指令。这两种指令,均属于 Java 虚拟机中的虚方法调用。 动态绑定:Java 虚拟机需要根据调用者的动态类型,来确定虚方法调用的目标方法。 静态绑定:调用静态方法的 invokestatic 指令,以及用于调用构造器,私有实例方法和超类非私有实例...原创 2019-01-18 21:53:35 · 225 阅读 · 0 评论 -
11 JVM 垃圾回收(上)
引用计数法和可达性分析 垃圾回收,就是将已经分配出去的,但却不在使用的内存回收回来,以便再次分配。在 Java 虚拟机语境下,垃圾指的是死亡的对象所占据的堆空间。下面就总结一下如何如何辨别一个对象是否死亡。 引用计数法:为每一个对象添加一个引用计数器,用来统计指向该对象的引用个数。如果某个对象的引用计数器为 0,则说明该对象已经死亡,便可以被回收了。 通过引用计数法来标记对象的死亡和存活的过程中,...原创 2019-01-24 19:54:21 · 254 阅读 · 0 评论