对那些做用于不会逃逸出方法的对象,在分配内存时,不在将对象分配在堆内存中,而是将对象属性打散后分配在线程私有栈内存上,这样随着方法调用结束,栈上分配打散的对象也被回收掉,不在增长 GC 额外压力。数据结构
循环建立1000000000一个对象,阻止栈上分配app
栈上分配条件:开启逃逸分析 & 开启标量替换jvm
JVM 参数:函数
-server -Xmx10m -Xms10m -XX:-DoEscapeAnalysis -XX:+PrintGC
spa
使用 server 模式弃用逃逸分析(-server -XX:-DoEscapeAnalysis),设置堆空间大小10m,初始空间10m,打印 GC 日志线程
-server -Xmx10m -Xms10m -XX:+PrintGC -XX:-EliminateAllocations
日志
以上二选一code
代码:server
package com.mousycoder.mycode.happy_jvm; /** * @version 1.0 * @author: mousycoder * @date: 2019-06-11 16:55 */ public class OnStackTest { public static class User{ public int id = 0; public String name = ""; } public static void alloc(){ User u = new User(); u.id = 5; u.name = "mousycoder"; } public static void main(String[] args) { long b = System.currentTimeMillis(); for (int i = 0; i < 1000000000; i++) { alloc(); } long e = System.currentTimeMillis(); System.out.println(e-b); } }
输出:对象
[GC (Allocation Failure) 7651K->5603K(9728K), 0.0003680 secs] [GC (Allocation Failure) 7651K->5603K(9728K), 0.0003829 secs] [GC (Allocation Failure) 7651K->5603K(9728K), 0.0003809 secs] [GC (Allocation Failure) 7651K->5603K(9728K), 0.0003731 secs] [GC (Allocation Failure) 7651K->5603K(9728K), 0.0003286 secs]
VisualGC:
分析:
本次发生的是 Minor GC,发生 GC 的缘由是堆空间没有合适的区域可以存放数据结构致使的,堆从7651K 回收到 5603K,
感谢您的耐心阅读,若是您发现文章中有一些没表述清楚的,或者是不对的地方,请给我留言,您的鼓励是做者写做最大的动力。
做 者 : @mousycoder