Java内存区域——堆内存

Java堆就是存储对象的实例,也就是说,堆的作用是非常单一的,其实就是存放对象的实例这么一个功能,当然了,Java虚拟机的Java堆一般来讲是Java虚拟机所管理的最大的一块内存区域,因为我们在一般的Java应用中,会不停的去创建对象,那么,只要是对象的存储,都会放到堆中,而每一个对象它所使用的内存也是不确定的,既然Java堆这一块区域是所管理的最大的区域,那么,也就是垃圾收集器所管理的主要区域,其实对于垃圾回收来讲,一般情况下,回收效率最高的也就是Java堆。

我们刚才说,所有的对象实例都会在Java堆上去分配内存,但是,这句话也不绝对,我们后面可能会讲一些编译期优化或者运行期优化的内容,到那个时候,大家可能就会了解一些比较高端的技术比如说逃逸分析标量替换栈量分配等一些高级的技术,在那里面,我们就可能会发现,其实对于优化过程中,随着优化技术的不断增强,其实并不是所有的对象实例都会分配在Java堆中,这个只要知道就可以,你完全可以理解成,所有的对象实例都是存放在堆中的,那么这是没有问题的。

提到堆内存,大家可能会听到新生代老生代Eden空间这样的一些词汇,其实堆的作用就是存放对象实例的,那么,它既然是存放对象实例,为什么还要分新生代、老生代、Eden空间这些东西呢?其实主要就是为了垃圾收集器,所以新生代、老生代、Eden空间这些内容也会统一的放到垃圾回收这一块来进行详细的讲解,当然了,除了分新生代、老生代、Eden空间这些区域以外,从内存分配的角度来讲,堆内存是线程共享的,但是它会在堆中划分出很多线程私有的分配缓冲区,那么,其实不管怎么分,都与存放内容无关,就是无论在哪个区,其实最终的目的你不管分多少区,分哪些区,按什么分,它的作用都是一样的,存储对象的实例,那么,它的目的也是相同的,就是为了垃圾收集器管理

如果我们在创建对象实例的过程中,堆内存申请不下来空间了,同样的会报OutOfMemory异常。

修改Java堆的大小,也是我们最熟悉的一个参数,-Xmx -Xms,通过这两个参数来指定动态的扩展来实现

猜你喜欢

转载自blog.csdn.net/G_66_hero/article/details/84198256