不一定是这样的
一般情况下对象和数组的内存分配是在堆内存上进行的,但随着JIT编译器的发展日渐成熟,很多优化是这种分配策略并非绝对
因为随着JIT的编译器的发展,在编译期间,如果JIT经过逃逸分析,发现有些对象没有逃逸出方法,那么可能堆内存分配会被优化成栈内存分配,但也不是绝对的,开启逃逸分析不是所有的对象都没有堆内存分配
逃逸分析:
逃逸分析是动态分析对象作用域的分析算法,通过逃逸分析,Java Hotspot编译器能够分析出一个新的对象的引用作用范围从而决定是否要将这个对象分配到堆内存中
逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义以后,他可能被外部方法所引用,例如调用参数传递到其他的方法中,称为方法逃逸
逃逸分析包括:
1.全局变量赋值逃逸
2.方法返回值逃逸
3.实例引用发生逃逸
4.线程逃逸:赋值给类变量或可以在其他的线程中访问实例的变量
开启逃逸分析:-XX:+DoEscapeAnalysis
关闭逃逸分析:-XX:-DoEscapeAnalysis
JDK 1.7开始默认开启了逃逸分析
package com.jvm; public class EscapeAnalysis { public static void main(String [] args){ long start=System.currentTimeMillis(); for(int i=0;i<1000000;i++){ newUser(); } long end=System.currentTimeMillis(); System.out.println("cost"+(end-start)+"ms"); try { Thread.sleep(100000); } catch (InterruptedException e) { e.printStackTrace(); } } private static void newUser(){ User user=new User(); } static class User{ } }
下面通过不开启逃逸分析 指定jvm参数运行 -Xmx4G -Xms4G -XX:-DoEscapeAnalysis -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError 通过jmap查看当前堆栈的内存对象可以看到 100万次循环创建了100万个User对象 下面开启逃逸分析 -Xmx4G -Xms4G -XX:+DoEscapeAnalysis -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError 通过jmap查看当前堆栈的内存对象可以看到 也就是说在经过JIT优化之后,堆内存中分配的对象数 量,从100万降到了16万多 除了以上通过jmap验证对象个数的方法以外,还可以尝试将堆内存调小,然后执行以上代码,根 据GC的次数来分析,也能发现,开启了逃逸分析之后,在运行期间,GC次数会明显减少。 正是 因为很多堆上分配被优化成了栈上分配,所以GC次数有了明显的减少。
Viagra Ohne Rezept De Ktvctq https://bestadalafil.com/ – cialis and viagra sales Cialis Dkvusf Vitamins Interfere With Amoxicillin Generic Amoxicillin Liquid Drops Erpvsm https://bestadalafil.com/ – Cialis