JVM内存模型

2016-10-05  本文已影响0人  我是猪队友Y
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是一个非可变类,使得其传值还是传引用显得没什么区别。

类变量,实例变量,局部变量,块变量的作用域分别是什么
JVM如何回收内存

Stack自动回收,Heap由GC自动回收.GC维护和检测对象引用,引用书数0的对象可能会被回收,GC并不是实时回收内存的,只有在适当的时候才会回收

System.gc():调用内存回收,但不一定会和回收,只能说几率比较大

上一篇 下一篇

猜你喜欢

热点阅读