java堆内存如图:
Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象。
在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor。
这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。
java程序员无需去关心有关内存的问题。原因则为:java具有自动内存管理机制。下文则介绍java该机制的大概是如何工作的。
java内存自动管理,无非是在做两个事情,①内存分配;②然后将分配出去的内存回收回来。在此内存分配不多叙述,重点关注java是如何将分配出去的内存是回收回来的。
垃圾收集器:
ps:关于引用:
在对象判活时无论是通过引用计数算法还是可达性分析,都与“引用”有关。
在jdk1.2以前,java中的类只存在“引用”与“未引用”两种概念。
在jdk1.2之后,对其进行了扩充。用以描述一些“食之无味,弃之可惜”的类。
强引用:类似“Object o = new Object();",只要强引用存在,则不会被垃圾收集器回收;
软引用:被软引用的对象,在系统发生内存溢出之前,会将其二次回收。
弱引用:活到下一次垃圾收集器工作;
虚引用:可忽略。