目录
导读
- java内存区域与内存溢出异常
- 垃圾收集器与内存分配策略
本篇主要讲jvm的自动内存管理机制,首先我们要拆分“自动内存管理机制”这个词:
- 首先是一个管理机制,
- 管理什么?内存!
- 为什么内存需要管理?、
- 内存会带来什么问题?
- 如何管理?自动管理!
- 如何自动管理?
带着这几个疑问,所以我们接下里会讲,管理的内存区域是什么?如何划分?为什么要划分?为什么采用自动管理?如何自动管理?自动管理会带来什么问题?
java内存区域
回答上面第2,3个问题:管理什么?内存!为什么内存需要管理?解决what ,why的问题
首先为什么内存需要管理?为什么内存要划分区域?
一句话总结:为了解决有限资源和无限需求的冲突!内存是有限的,但在运行的过程中最大的冲突就是:内存不够用,如何解决的?通过管理内存,决定哪些留下,哪些丢掉来保证内存够用!通过内存区域划分达到最小代价的高性能利用内存资源。
其次如何java内存区域是如何划分的?
java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域有各自的用途,以及创建和销毁的时间! 那么这些内存是如何布局的呢?在jvm中处于什么位置呢?java8内存模型图
内存溢出测试思路
接下来回答问题4:内存会带来什么问题?
当你明白内存有限,需求无限的时候,就应该能想到,会出现内存不够用的情况,内存的各个区域都可能会出现不够用的情况!
另外,由于Java堆内也可能发生内存泄露(Memory Leak),这里简要说明一下内存泄露和内存溢出的区别:
1、内存泄露是指分配出去的内存没有被回收回来,由于失去了对该内存区域的控制,因而造成了资源的浪费。Java中一般不会产生内存泄露,因为有垃圾回收器自动回收垃圾,但这也不绝对,当我们new了对象,并保存了其引用,但是后面一直没用它,而垃圾回收器又不会去回收它,这边会造成内存泄露,
2、 内存溢出是指程序所需要的内存超出了系统所能分配的内存(包括动态扩展)的上限。其实两者还是有关联的,如因为没有及时回收垃圾对象造成可用空间不足,这个时候再给新的对象分派内存空间的时候就会出现内存溢出的现象。
小结
最后两个问题:内存如何管理?自动管理!那又是如何自动管理呢?请阅读下篇博客:【JVM】自动内存管理机制《二》