JVM内存回收策略介绍

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jiyang_1/article/details/50035357

     java语言不像C/C++一样可以通过malloc这种语法直接操作内存,java语言没有提供直接操作内存的语法,但程序都需要内存空间来支持,java语言通常有两种内存申请方法:一种是静态内存分配,另一种是动态内存分配。

1、静态内存分配和回收

     java静态内存分配是指java被编译时,就已经能够确定需要的内存空间,当程序被加载时,系统会一次性分配内存给它,这些内存不会在程序执行是发生变化,直到程序结束内存才会被回收。例如一些数据类型和对象的引用。这些静态内存空间是在java栈上分配的,当这个方法运行结束时,对应的栈也就撤销,所以分配的静态内存空间也就回收了。

2、动态内存分配和回收

     原生数据类型存储在java栈中,方法执行结束就会消失,关于对象类型,他存储在java堆中,它可以被共享,不一定随着方法执行结束而消失。所谓动态类型分配就是在程序执行时才知道要分配的存储空间的大小,而不是在编译时就能确定的。这个对象什么时候被回收也是不确定的,只有等到这个对象不再使用时才会被回收。Java程序员不需要关注内存的分配和回收,只需要关注这些数据类型的使用就行了。

3、关于java中内存分配:

  • 栈内存分配
  • 堆内存分配
从堆和栈的功能和作用来比较,堆主要用来存放对象,栈主要用来执行程序,这主要是由堆和栈的特点来决定的。栈中主要存放一些基本类型的变量数据(int short long byte float double boolean char)和对象句柄(即引用),存取速度快。堆的优势可以动态的分配内存的大小,生存周期不必告诉编译器,保存数据时具有灵活性,但再分配和销毁时要占用一定时间。

4、如何进行垃圾回收(GC)呢?

     JVM在做垃圾回收时会检查堆中的所有对象是否都会被这些根对象直接或间接引用,能够被引用的对象就是活动对象,否则就可以被垃圾收集器回收。所谓根对象是堆中持久用的对象,它若引用或者间接引用其他对象时,引用的对象不能被垃圾器回收,若此对象没有直接引用和间接引用,则就要被垃圾收集器回收。


本文不再讨论内存垃圾收集算法。

展开阅读全文

没有更多推荐了,返回首页