堆(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];
结果错误为: