
jvm
文章平均质量分 92
路漫聊架构
奋斗在互联网行业,拥有10余年java研发经验,5年架构设计经验及团队管理经验
擅长微服务架构设计及架构演进,分布式服务开发,小程序开发
技术栈:java,python,vue,springboot,springcloud,mysql,redis,tidb
展开
-
JVM是如何处理异常的
众所周知,异常处理的两大组成要素是抛出异常和捕获异常。这两大要素共同实现程序控制流的非正常转移。抛出异常可分为显式和隐式两种。显式抛异常的主体是应用程序,它指的是在程序中使用“throw”关键字,手动将异常实例抛出。隐式抛异常的主体则是 Java 虚拟机,它指的是 Java 虚拟机在执行过程中,碰到无法继续执行的异常状态,自动抛出异常。举例来说,Java 虚拟机在执行读取数组操作时,发现输入的索引值是负数,故而抛出数组索引越界异常(ArrayIndexOutOfBoundsException)。 捕获异常则原创 2021-03-14 15:21:09 · 366 阅读 · 0 评论 -
JVM是如何执行方法调用的?(下)
这个 Idea 究竟是什么呢,我们知道,设计模式大量使用了虚方法来实现多态。但是虚方法的性能效率并不高,所以我就说,是否能够在此基础上写篇文章,评估每一种设计模式因为虚方法调用而造成的性能开销,并且在文章中强烈谴责一下?当时呢,我老板教的是一门高级程序设计的课,其中有好几节课刚好在讲设计模式的各种好处。所以,我说完这个 Idea,就看到老板的神色略有不悦了,脸上写满了“小郑啊,你这是舍本逐末啊”,于是,我就连忙挽尊,说我是开玩笑的。在这里呢,我犯的错误其实有两个。第一,我不应该因为虚方法的性能效率,而放弃良原创 2021-03-14 14:35:05 · 215 阅读 · 0 评论 -
JVM是如何执行方法调用的?(上)
前不久在写代码的时候,我不小心踩到一个可变长参数的坑。你或许已经猜到了,它正是可变长参数方法的重载造成的。(注:官方文档建议避免重载可变长参数方法,见[1]的最后一段。) void invoke(Object obj, Object... args) { ... } void invoke(String s, Object obj, Object... args) { ... } invoke(null, 1); // 调用第二个invoke方法 invoke(null, 1, 2); // 调用原创 2021-03-14 14:27:12 · 223 阅读 · 0 评论 -
Java虚拟机是如何加载Java类的?
从 class 文件到内存中的类,按先后顺序需要经过加载、链接以及初始化三大步骤。其中,链接过程中同样需要验证;而内存中的类没有经过初始化,同样不能使用。那么,是否所有的 Java 类都需要经过这几步呢? 我们知道 Java 语言的类型可以分为两大类:基本类型(primitive types)和引用类型(reference types)。在上一篇中,我已经详细介绍过了 Java 的基本类型,它们是由 Java 虚拟机预先定义好的。 至于另一大类引用类型,Java 将其细分为四种:类、接口、数组类和泛型参数。原创 2021-03-14 14:08:00 · 186 阅读 · 0 评论 -
java虚拟机基本原理系列-java代码如何运行的?
java代码如何运行的? Java 代码有很多种不同的运行方式。 1、比如说可以在开发工具中运行, 2、双击执行 jar 文件运行, 3、命令行中运行, 4、可以在网页中运行 当然,这些执行方式都离不开 JRE,也就是 Java 运行时环境。 实际上,JRE 仅包含运行 Java 程序的必需组件,包括 Java 虚拟机以及 Java 核心类库等。我们 Java 程序员经常接触到的 JDK(Java 开发工具包)同样包含了 JRE,并且还附带了一系列开发、诊断工具。 然而,运行 C++ 代码则无需额外的运行时原创 2021-03-14 13:50:09 · 52 阅读 · 0 评论