Java关于内存的需知

堆(heap)和栈(stack)

这里写图片描述

  • 堆(heap):堆是虚拟机所管理内存中最大的一块,它是被线程共享的一块区域,主要存放对象的实例。
  • 栈(stack):java每一个线程都会有自己的栈区,它包含了所运行程序的方法和基本数据类型(byte、char、short、int、long、float、double、boolean)和实例对象的引用。
        String string1 = "Hello";
        String string2 = "Hello";
        System.out.println(string1 == string2);
        //结果为:true

上面函数中,首先在栈中创建string1的引用,在堆中查找是否有”Hello”,这个常量字符,如果没有,就在里面创建,然后string1指向它。接着由于”Hello”已经在堆中的常量池存在,所以直接将string2指向它,由此得知string1==string2结果为true。

        String string1 = new String("Hello");
        String string2 = new String("Hello");
        System.out.println(string1 == string2);
        // 结果为:false

在这个函数中,首先在栈中创建string1的引用,在常量池中查找”Hello”这个字符串,如果没有,就在里面创建”Hello”,然后在堆中开辟一个空间用来存放它。string2也是一样,也会在堆中开辟一个空间用来存放”Hello”,所以即便数据相同,也不会共享数据空间,导致指向引用不同的内存空间,所以结果为false。

内存中发生的error

java.lang.StackOverflowError(栈溢出错误):
这里写图片描述
内存中的栈是一个单向链表式结构,采用先进后出的原则,先进栈被后进栈的压缩到最底部,称之为压栈,当栈溢满时,就会发生栈溢出错误。由于方法是存储在栈之中的,我们可以采用递归方式测量栈的深度

private static int count = 0;

    public static void main(String[] args) {
        test test = new test();
        test.study();
    }

    public void study() {
        System.out.println(count++);
        study();
    }

这里得出的count,就是我们方法所调用的次数
这里写图片描述

java.lang.OutOfMemoryError(内存溢出错误):
堆中存放的是被创建的对象,我们可以通过定义数组长度的方式测量堆的大小。

int[] array = new int[2000000000];

结果错误为:这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_41356363/article/details/80616895