From 3238f888992a8c98f4112a5b74ed081328a74ba3 Mon Sep 17 00:00:00 2001 From: Omooo <869759698@qq.com> Date: Fri, 4 Jan 2019 10:30:59 +0800 Subject: [PATCH] add Method Inlining --- README.md | 6 +++++- blogs/JVM/方法内联.md | 23 +++++++++++++++++++++++ blogs/泛型.md | 9 +++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 blogs/JVM/方法内联.md create mode 100644 blogs/泛型.md diff --git a/README.md b/README.md index 94046db..c69c66c 100644 --- a/README.md +++ b/README.md @@ -23,4 +23,8 @@ Android Notes [final 你需要知道的一切](https://github.com/Omooo/Android-Notes/blob/master/blogs/final.md) -[String 你需要知道的一切](https://github.com/Omooo/Android-Notes/blob/master/blogs/String.md) \ No newline at end of file +[String 你需要知道的一切](https://github.com/Omooo/Android-Notes/blob/master/blogs/String.md) + +#### JVM + +[方法内联]() \ No newline at end of file diff --git a/blogs/JVM/方法内联.md b/blogs/JVM/方法内联.md new file mode 100644 index 0000000..17f1d00 --- /dev/null +++ b/blogs/JVM/方法内联.md @@ -0,0 +1,23 @@ +--- +方法内联 +--- + +#### 概述 + +方法内联是指,在编译过程中,当遇到方法调用时,将目标方法的方法体纳入编译范围之中,并取代原方法调用的优化手段。 + +方法内联不仅可以消除调用本身带来的性能开销,还可以进一步触发更多的优化。因此,它可以算编译优化里最为重要的一环。 + +以 getter/setter 为例,如果没有方法内联,在调用 getter/setter 时,程序需要保存当前方法的执行位置,创建并压入用于 getter/setter 的栈桢、访问字段、弹出栈桢,最后在恢复当前方法的执行。而当内联了对 getter/setter 的方法调用后,上述操作仅剩字段访问了。 + +在 C2 和 Graal (它们都是 JIT 编译器)中,方法内联是在解析字节码的过程中完成的。每当碰到方法调用字节码时,C2 将决定是否需要内联该方法调用,如果需要内联,则开始解析目标方法的字节码。 + +#### 内联条件 + +方法内联能够触发更多的优化。通常而言,内联越多,生成的代码的执行效率越高。然后,,对于编译器来说,内联越多,编译时间就越长,而程序达到峰值性能的时刻也将被推迟。 + +因此,即时编译器不会无限制的进行方法内联。 + +方法内联有很多规则,除了一些强制内联以及强制不内联的规则外,比如自动拆箱总会被内联,Throwable 类的方法不能被其他类中的方法所内联等,即时编译器会根据方法调用的层数、方法调用指令所在的程序路径的热度、目标方法调用次数及大小,以及当前 IR 图的大小来决定方法调用能否被内联。 + +但是,对于虚方法(非 final、static 的方法)而言,即时编译器先要去虚化才能进行方法内联。 \ No newline at end of file diff --git a/blogs/泛型.md b/blogs/泛型.md new file mode 100644 index 0000000..d268888 --- /dev/null +++ b/blogs/泛型.md @@ -0,0 +1,9 @@ +--- +泛型 +--- + +#### 目录 + +1. 思维导图 +2. +