一、Java中的内存管理
1、程序,无论是代码还是数据,都需要存储在内存中。JVM为Java程序提供并管理所需要的内存空间
2、JVM内存分为堆(heap)、栈(stock)、方法区(method)三个区域,分别用于储存不同的数据。
3、HotSpot是Sun JDK和Open JDK中所带的虚拟机(Sun JDK和Open JDK除了注释,代码实现基本上是相同的)。
二、堆
1、 JVM只有一个堆区,在虚拟机启动时创建,被所有线程共享,堆区不放基本类型(成员变量除外)和对象的引用,只存储对象本身(包括class对象和异常对象)和数组,堆是GC所管理的主要区域(对不需要的对象进行标记,而后进行清除)。
2、堆内存的划分


3、GC流程
- 基本所有数据都会保存在JVM的堆内存之中。
- java应用程序开发之jvm基础对于整个的GC流程里面,最需要处理的事是 年轻代 和 老年代 的内存清理操作。
- 元空间(永久代)都不在GC范围内。

新生代的GC的时候使用复制算法
老年区的GC的时候使用标记-清除算法
垃圾回收的类型
串行GC
并行GC
为并发GC
GC具体流程:
- 当现在有一个新生的对象产生,JVM需要为该对象进行内存空间申请。
- 先判断Eden区是否有内存空间,如果有,直接将新对象保存在Eden区。
- 如果Eden区的内存空间不足,会自动执行一个Minor GC操作,将Eden区无用内存空间进行清理。
- 清理Eden区之后继续判断Eden区内存空间情况,如果充足,则将新对象直接保存在Eden区。
- 如果执行了Minor GC之后发现Eden区的内存仍然不足,那就判断存活区的内存空间,并将Eden区的部分活跃对象保存在存活区。
- 活跃对象迁移到存活区后,继续判断Eden区内存空间情况,如果充足,则将新对象直接保存在Eben区。
- 如果存活区也没有空间了,则继续判断老年区,如果老年区充足,则将存活区部分活跃对象保存在老年区。
- 存活区的活跃对象迁移到老年区后,则将Eden区的部分活跃对象保存到存活区。
- 活跃对象迁移到存活区后,继续判断Eden区内存空间情况,如果充足,则将新对象直接保存在Eden区。
- 如果老年区也满了,这时候产生Major GC(full GC)进行老年区的内存清理。
- 如果老年区执行Major GC之后发现无法进行对象保存,会产生OutOfMemoryError异常。
堆内存参数调整:(调优关键)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/5454.html