转自:https://blog.csdn.net/hustwht/article/details/52109343java
GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,程序员
忘记或者错误的内存回收会致使程序或系统的不稳定甚至崩溃,Java提供的GC功能能够自动监测对象是否超过做用域从而达到自动回收内存的目的,编程
Java语言没有提供释放已分配内存的显示操做方法。Java程序员不用担忧内存管理,由于垃圾收集器会自动进行管理。要请求垃圾收集,能够调用下面的方法之一:服务器
System.gc()或Runtime.getRuntime().gc(),但JVM能够屏蔽掉显示的垃圾回收调用。 spa
垃圾回收能够有效的防止内存泄露,有效的使用可使用的内存。垃圾回收器一般是做为一个单独的低优先级的线程运行,不可预知的状况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或全部对象进行垃圾回收。.net
在Java诞生初期,垃圾回收是Java最大的亮点之一,由于服务器端的编程须要有效的防止内存泄露问题,然而时过境迁,现在Java的垃圾回收机制已经成为被诟病的东西。移动智能终端用户一般以为iOS的系统比Android系统有更好的用户体验,其中一个深层次的缘由就在于Android系统中垃圾回收的不可预知性。线程
一、java语言最显著的特色就是引入了垃圾回收机制,它使java程序员在编写程序时再也不考虑内存管理的问题。
二、因为有这个垃圾回收机制,java中的对象再也不有“做用域”的概念,只有引用的对象才有“做用域”。
三、垃圾回收机制有效的防止了内存泄露,能够有效的使用可以使用的内存。
四、垃圾回收器一般做为一个单独的低级别的线程运行,在不可预知的状况下对内存堆中已经死亡的或很长时间没有用过的对象进行清除和回收。
五、程序员不能实时的对某个对象或全部对象调用垃圾回收器进行垃圾回收。对象
垃圾回收机制有分代复制垃圾回收、标记垃圾回收、增量垃圾回收blog
采用“分代式垃圾收集”。这种方法会跟Java对象的生命周期将堆内存划分为不一样的区域,在垃圾收集过程当中,可能会将对象移动到不一样区域:
- 伊甸园(Eden):这是对象最初诞生的区域,而且对大多数对象来讲,这里是它们惟一存在过的区域。
- 幸存者乐园(Survivor):从伊甸园幸存下来的对象会被挪到这里。
- 终身颐养园(Tenured):这是足够老的幸存对象的归宿。年轻代收集(Minor-GC)过程是不会触及这个地方的。当年轻代收集不能把对象放进终身颐养园时,就会触发一次彻底收集(Major-GC),这里可能还会牵扯到压缩,以便为大对象腾出足够的空间。生命周期
与垃圾回收相关的JVM参数:
· -Xms / -Xmx —堆的初始大小 / 堆的最大大小
· -Xmn — 堆中年轻代的大小
补充:
Java是由C++发展来的。
它摈弃了C++中一些繁琐容易出错的东西。其中有一条就是这个GC。
写C/C++程序,程序员定义了一个变量,就是在内存中开辟了一段相应的空间来存值。内存再大也是有限的,因此当程序再也不须要使用某个变量的时候,就须要释放这个内存空间资源,好让别的变量来用它。在C/C++中,释放无用变量内存空间的事情要由程序员本身来解决。就是说当程序员认为变量没用了,就应当写一条代码,释放它占用的内存。这样才能最大程度地避免内存泄露和资源浪费。
可是这样显然是很是繁琐的。程序比较大,变量多的时候每每程序员就忘记释放内存或者在不应释放的时候释放内存了。并且释放内存这种事情,从开发角度说,不该当是程序员所应当关注的。程序员所要作的应该是实现所须要的程序功能,而不是耗费大量精力在内存的分配释放上。
Java有了GC,就不须要程序员去人工释放内存空间。当Java虚拟机发觉内存资源紧张的时候,就会自动地去清理无用变量所占用的内存空间。固然,若是须要,程序员能够在Java程序中显式地使用System.gc()来强制进行一次当即的内存清理。
由于显式声明是作堆内存全扫描,也就是 Full GC,是须要中止全部的活动的(Stop The World Collection),你的应用能承受这个吗?而其显示调用System.gc()只是给虚拟机一个建议,不必定会执行,由于System.gc()在一个优先级很低的线程中执行。