美文网首页
JVM内存模型

JVM内存模型

作者: NiklausTxt | 来源:发表于2016-10-05 19:43 被阅读0次

    Java内存模型把Java虚拟机内部划分为线程栈和堆。

    Java 内存中堆和栈有什么区别:

    Stack栈是存放方法的局部变量的内存空间

    每个方法都会分配一块空间Frame

    方法一旦执行完成,Frame被销毁

    对于原始类型,变量的值也保存在Stack里面

    对于引用类型,Stack里面保存的是指向对象的内存地址(引用)

    Heap堆是存放Object,放的是类的实例

    Java方法中的参数是传值还是传引用?

    Java中的参数是传值,只不过有时参数传的是对象的内存地址

    Java 中类变量、实例变量、局部变量、块变量的作用域

    类变量,实例变量,局部变量,块变量的作用域逐渐变小

    块变量:例如for语句中定义的i,只在for语句中有作用

    JVM 如何回收内存

    局部变量方法执行完后内存马上被回收

    Heap里面的对象由GC自动回收

    GC维护和检测对象引用,引用数为0的对象会被回收

    GC并不是实时回收内存的

    Java的垃圾回收是由JVM来完全负责的,对用户来说基本上是透明的。之所以说基本,是因为:

    1) 用户可以使用Finalize函数在垃圾对象回收之前,释放由本地方法申请的内存空间或者关闭文件等操作。

    2) 用户可以使用System.gc()建议JVM进行垃圾回收,但需要注意的是,这仅仅是建议,至于什么时候回收,会不会回收都是未知的,都是由JVM来完全负责的。

    JVM以独立的,低优先级的线程来对堆空间进行检测。整个垃圾回收机制主要涉及两个根本问题:其一是要确定到底什么是垃圾。其二要是释放垃圾对象占用的内存空间。

    首先我们先来看第一问题,Java中没有被其他对象引用的对象即为垃圾对象,Java中有四种类型的对象引用:StrongReference, SoftReference, WeakReference, PhantomReference.

    在了解了到底什么是垃圾之后,我想介绍一下JVM的垃圾回收算法。目前,JVM主流的垃圾回收算法是一种叫做分代垃圾回收的算法。我觉得采用这种算法一个立足点在于:JAVA中对大多数对象都存活期较短,能长时间存在的对象占少数。正是基于这样一个事实,我觉得才有必要对JAVA的主存空间按照对象的存活期进行划分。

    分代垃圾回收算法主要包括以下三个回收算法:复制收集,Mark-Sweep(标记清除收集),Mark-Compacting(标记压缩收集)

    参考:http://www.cnblogs.com/zengkefu/p/5759337.html

    相关文章

      网友评论

          本文标题:JVM内存模型

          本文链接:https://www.haomeiwen.com/subject/cszsyttx.html