JVM内存模型

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():调用内存回收,但不一定会和回收,只能说几率比较大

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • JVM内存模型Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是: ...
    光剑书架上的书阅读 7,607评论 2 26
  • 文章转自 http://blog.csdn.net/u012152619/article/details/4696...
    云狗狗狗狗狗阅读 3,783评论 1 4
  • 1、程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看...
    妖云小离阅读 3,388评论 0 0
  • Java内存模型把Java虚拟机内部划分为线程栈和堆。 Java 内存中堆和栈有什么区别: Stack栈是存放方法...
    NiklausTxt阅读 2,900评论 4 2
  • 家乡在四川南方的一个小城里,依山傍水,四季都是翠绿的一片,没有北方秋天树木尽枯的萧瑟,也没有冬季白雪皑皑的大地...
    倾座城淡场梦阅读 2,967评论 0 0

友情链接更多精彩内容