JAVA垃圾回收机制

一、虚拟机中的堆与栈

  • 首先我们先来看一下Java虚拟机中的内存堆栈模型图:

JAVA垃圾回收机制_第1张图片
然后我没来概括一下什么的堆什么是 栈:

  • 堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
  • **栈(操作系统):**由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

几种常见的内存溢出的异常:
1、Out Of Memory Error:Meta space:方法区内存溢出
2、Out Of Memory Error:Heap space 堆内存溢出错误
3、Stack Overflow Error栈内存溢出

二、垃圾回收机制(GC)

**GC的优点:**GC可以有效的防止内存泄露,有效的使用可以使用的内存。
GC常用的算法:

1、标记清除算法:
清除效率高,性能高、简单,但是会造成内存碎片太多,使内存使用效率不高
2、分段复制算法 :
将内存空间,分成两半用一半,留一半,避免内存碎片,效率高,执行的过程中容易造成服务器卡顿
3、标记-整理算法:
整理成,连续的标记清除法的改良版
4、分代收集算法:
新生代:伊甸园:刚创建的对象,通常寿命较短,(短命对象) 在这个区域中将会被回收掉大量的垃圾对象
生存区(From, To 区),经过伊甸园的筛选,存活下来的对象,就会存到这个区域中,这个区域中的对象被回收的几率较大
老年代:通过层层回收,从新生代存活下来的对象,就进入了老年代,这个区域中的对象,被回收几率减小,
永久代:经过很多次的回收还存活下来的对象,说明,这些对象可能最近这一段时间不会是垃圾,这个区域的对象,基本上是不会回收的。
JAVA垃圾回收机制_第2张图片

三、高效代码技巧:
1、尽量不要在循环中:使用try —catch,new 对象等操作
2、把频繁使用的短命对象(在伊甸园中的对象,称为短命对象),缓存起来
3、尽可能使用栈内变量(方法内局部变量)
4、不要用异常来控制代码流程
5、用线程池,连接池,不要自己创建
6、学会读java核心API源代码

你可能感兴趣的:(后端,java垃圾回收机制)