自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(10)
  • 资源 (5)
  • 收藏
  • 关注

原创 方法内联(下)

然而,对于需要动态绑定的虚方法调用来说,即时编译器则需要先对虚方法调用进行虚化(devirtualize),即转换为一个或多个直接调用,然后才能进行方法内联。即时编译器的去虚化方式可分为完全去虚化以及条件去虚化(guarded devirtualization)。完全去虚化是通过类型推导或者类层次分析(class hierachy analysis),识别虚方法调用的唯一目标方法,从而将其...

2019-05-29 13:50:45 10834

原创 方法内联(上)

它指的是:在编译过程中遇到方法调用时,将目标方法的方法体纳入编译范围之中,并取代原方法调用的优化手段。方法内联不仅可以消除调用本身带来的性能开销,还可以进一步触发更多的优化。因此,它可以算是编译优化里最为重要的一环。以getter/setter为例,如果没有方法内联,在调用getter/settter时,程序需要保存当前方法的执行位置,创建并压入用于getter/setter的栈桢、访问字...

2019-05-21 10:44:19 12028

原创 逃逸分析

Java中Iterable对象的foreach循环遍历是一个语法糖,Java编译器会将该语法糖编译为调用Iterable对象的iterator方法,并用返回的Iterator对象的hasNext以及next方法,来完成遍历。public void forEach(ArrayList<Object> list, Consumer<Object> f) { for...

2019-05-21 10:32:58 11392

原创 Java字节码(基础篇)

操作数栈Java字节码是Java虚拟机所使用的指令集。因此,它与Java虚拟机基于栈的计算模型是密不可分的。在解释执行过程中,每当为Java方法分配栈桢时,Java虚拟机往往需要开辟一块额外的空间作为操作数栈,来存放计算的操作数以及返回结果。具体来说便是:执行每一条指令之前,Java虚拟机要求该指令的操作数已被压入操作数栈中。在执行指令时,Java虚拟机会将该指令所需的操作数弹出,并且...

2019-05-16 17:21:52 14743 1

原创 JVM是如何实现反射的?

反射调用的实现每个Method实例的第一次反射调用都会生成一个委派实现,它所委派的具体实现便是一个本地实现。本地实现非常容易理解。当进入了Java虚拟机内部之后,我们便拥有了Method实例所指向方法的具体地址。这时候,反射调用无非就是将传入的参数准备好,然后调用进入目标方法。// v0 版本import java.lang.reflect.Method;public class ...

2019-05-15 11:11:14 10109

原创 Java虚拟机是怎么实现synchronized的?

在Java程序中,我们可以利用synchronized关键字来对程序进行加锁。它既可以用来声明一个synchronized代码块,也可以直接标记静态方法或者实例方法。当声明synchronized代码块时,编译而成的字节码将包含monitorenter和monitorexit指令。这两种指令均会消耗操作数栈上的一个引用类型的元素(也就是synchronized关键字括号 里的引用),作为所要加...

2019-05-15 10:59:57 9678

原创 JVM是如何执行方法调用的?(下)

1.虚方法的调用Java里所有非私有实例方法调用都会被编译成invokevirtual指令,而接口方法调用都会被编译成invokeinterface指令。这两种指令,均属于Java虚拟机中的虚方法调用。在绝大多数情况下,Java虚拟机需要根据调用者的动态类型,来确定虚方法调用的目标方法。这个过程我们称之为动态绑定。那么,相对于静态绑定的非虚方法调用来说,虚方法调用更加耗时。在Java虚...

2019-05-10 11:03:01 10287

原创 JVM是如何执行方法调用的?(上)

重载与重写重载的方法在编译过程中即可完成识别。具体到每一个方法调用,Java编译器会根据所传入参数的声明类型(注意与实际类型区分)来选取重载方法。选取的过程共分为三个阶段:1.在不考虑对基本类型自动装拆箱(auto-boxing,auto-unboxing),以及可变长参数的情况下选取重载方法:2.如果在第1个阶段中没有找到适配的方法,那么在允许自动装拆箱,但不允许可变长参数的情况下选...

2019-05-10 10:59:29 10175

原创 Java虚拟机是如何加载Java类的?

Java语言的类型可以分为两大类:基本类型(primitive types)和引用类型(reference types)。基本类型是由Java虚拟机预先定义好的。另一个大类引用类型,Java将其细分为四种:类、接口、数组类和泛型参数。由于泛型参数会在编译过程中被擦除,因此Java虚拟机实际上只有前三种。在类、接口和数组类中,数组类是由Java虚拟机直接生成的,其他两种则有对应的字节流。说到...

2019-05-09 14:16:15 10221

原创 java代码是怎么运行的?

为什么Java要在虚拟机里运行?java程序抽象程度高,肯定不能直接在硬件上运行。运行之前肯定需要先转换程机器码。不同的机器转换出的机器码肯定不一样。1.使用虚拟机Java转换出的字节码是一致的,通过java虚拟机字节码转换为对应的机器码,因此java才有了跨平台的效果,由于字节码不变,java程序就可以在不同平台上的虚拟机运行。2.提供托管环境,自动内存管理与垃圾回收。托管环境还提供...

2019-05-08 16:27:50 10529

Xshell+ftp个人班免费使用

在xshell官网通过申请,提供的免费版的软件进行使用,若有安装过可以直接覆盖以前已到期的软件。

2019-01-30

Java多线程编程核心技术

java多线程编程核心---详细说明并发编程核心技术。 在java并发编程基础上加深细节理解。

2019-01-08

java编译后的文件上传至linux服务端

帮助把git两个提交间的差异文件从本地编译后的项目中上传至linux系统服务端项目并生成统计的相关文件信息

2018-09-08

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除