GC 是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导
致程序或系统的不稳定甚至崩溃,Java 提供的 GC 功能可以自动监测对象是否超过作用域从而达到
自动回收内存的 目的,Java 语言没有提供释放已分配内存的显示操作方法。Java 程序员不用担心
内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集可以调用下面的方法之一:System.
gc()或 Runtime. getRuntime(). gc(),但 JVM 可以屏蔽掉线示的垃圾回收调用。
垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单
独的低优先级的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象
进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。在
Java 诞生初期,垃圾回收是 Java 最大的亮点之一,因为服务器端的编程需要有效的防止内存泄露
问题,然而时过境迁,如今 Java 的垃圾回收机制已经成为被诟病的东。移动智能终端用户通常觉
得 iOS 的系统比 Android 系统有更好的用户体验,其中一个深层次的原因就在于 Android 系统中垃
圾回收的不可预知性。
堆(Heap-线程共享) -运行时数据区
是被线程共享的一块内存区域,创建的对象和数组都保存在 Java 堆内存中,也是垃圾收集器进行
垃圾收集的最重要的内存区域。由于现代 VM 采用分代收集算法,因此 Java 堆从 GC 的角度还可以
细分为:新生代(Eden 区、From Survivor 区和 To Survivor 区)和老年代。
方法区/永久代(线程共享)
即我们常说的永久代(Permanent Generation),用于存储被 JVM 加载的类信息、常量、静态变量即、
时编译器编译后的代码等数据. HotSpot VM 把 GC 分代收集扩展至方法区,即使用 Java 堆的永久代
来实现方法区,这样 HotSpot 的垃圾收集器就可以像管理 Java 堆一样管理这部分内存,而不必为方
法区开发专门的内存管理器(永久带的内存回收的主要目标是针对常量池的回收和类型的卸载,因
此收益一般很小)。
运行时常量池(Runtime Constant Pool)是方法区的一部分。Class 文件中除了有类的版本、字段、方
法、接口等描述等信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种
字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。Java 虚拟机对 Class
文件的每一部分(自然也包括常量池)的格式都有严格的规定,每一个字节用于存储哪种数据都必须
符合规范上的要求,这样才会被虚拟机认可、装载和执行。
JVM 运行时内存
Java 堆从 GC 的角度还可以细分为:新生代(Eden 区、From Survivor 区和 To Survivor 区)和老年代。
新生代
是用来存放新生的对象。一般占据堆的 1/3 空间。由于频繁创建对象,所以新生代会频繁触发
MinorGC 进行垃圾回收。新生代又分为 Eden 区、ServivorFrom、ServivorTo 三个区。
Eden 区
Java 新对象的出生地(如果新创建的对象占用内存很大,则直接分配到老年代)。当 Eden 区内存不够
的时候就会触发。MinorGC,对新生代区进行一次垃圾回收。
ServivorFrom
上一次 GC 的幸存者,作为这一次 GC 的被扫描者。