JVM的内存中的堆(Heap)和栈(Stack)有什么区别
Stack是存放方法的局部变量的内存空间,每个方法都会分配一块空间Frame。方法一旦执行完成,Frame被销毁。Stack中的数据是共享的
对于原始类型(八个基本类型),变量的值也保存在Stack里面。
对于引用类型,Starck里面保存的是指向对象的内存地址(引用)。
而String比较特殊,当形式为String a="a"时存放在栈中,而String a=new String("a"),是存放在堆中.
Heap堆存放Object
在JVM内存中,线程是共享一个Heap的,而每个线程都有自己的栈。
java方法中的参数是传值还是传引用
Java 应用程序有且仅有的一种参数传递机制,即按值传递
Java是传值,那么传递的是值的副本;如果Java是传引用,那么传递的是引用的副本。
对于基本类型变量(int、long、double、float、byte、boolean、char),Java是传值的副本。(这里Java和C++相同)
对于一切对象型变量,Java都是传引用的副本。其实传引用副本的实质就是复制指向地址的指针
String类型也是对象型变量,所以它必然是传引用副本。不要因为String在Java里面非常易于使用,而且不需要new,就被蒙蔽而把String当做基本变量类型。只不过String是一个非可变类,使得其传值还是传引用显得没什么区别。
类变量,实例变量,局部变量,块变量的作用域分别是什么
- 类变量:作用在类上面
- 实例变量:只在一个实例中有效
- 局部变量:方法中声明定义的变量或方法的参数被称为局部变量
- 快变量:作用于块内,在块中定义使用例如for循环块等
JVM如何回收内存
Stack自动回收,Heap由GC自动回收.GC维护和检测对象引用,引用书数0的对象可能会被回收,GC并不是实时回收内存的,只有在适当的时候才会回收
System.gc():调用内存回收,但不一定会和回收,只能说几率比较大