Java基础之《JVM性能调优(3)—堆》

Java基础之《JVM性能调优(3)—堆》,第1张

Java基础之《JVM性能调优(3)—堆》

一、什么是堆,它和栈有什么区别?
1、变量和堆的关系 

package heap;

public class Test01 {
    public static void test() {
        int j = 100;
    }

    public static void main(String[] args) {
        int i = 10;
        test();
    }
}

以上代码的执行顺序:
(1)main方法,java虚拟机栈开辟了一个栈帧,存放变量int i = 10
(2)执行到test方法时,java虚拟机栈新开辟一个栈帧,存放变量int j = 100
(3)test方法执行完后,test栈帧被回收(后进先出),但是main栈帧没执行完就没回收

方法的变量和堆没有关系,存储在栈帧里

2、数组和堆的关系

package heap;

public class Test02 {
    public static void main(String[] args) {
        int[] x = new int[5];
        x[0] = 100;
        x = null;
    }
}

以上代码的执行顺序:
(1)执行main方法,java虚拟机栈开辟了一个栈帧。
当执行int[] x = new int[5]时,栈开辟了x变量空间,该变量存放的是堆的引用地址。
堆开辟了x数组空间,例如0x0001,存放数组的值。数组的元素都设置默认值0.
栈里的x存放的是堆的引用地址,例如x = 0x0001。
(2)执行x[0]=100时,
堆会为x[0]=100,栈的x变量不会变,继续引用堆的地址。 

(3)当执行x=null时,x引用的内存地址被删除,例如栈帧删除了0x0001。而堆中的数组不再被x使用后,就会变成垃圾,堆不会立即删除,它是采用垃圾回收算法删除。

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5707085.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存