对于Java开发来讲,在虚拟机内存管理的帮助下,不须要为每一个新的对象在代码层面分配内存,回收内存,好比像C语言那样操做。因此在正常状况下,内存泄露和内存溢出等问题也不太容易出现。因此要是运行中的程序出现了内存泄露问题,排查仍是有必定困难。安全
Java堆是被全部线程共享的一块内存区域,主要用于存放对象实例,为对象分配内存就是把一块大小肯定的内存从堆内存中划分出来,一般有指针碰撞和空闲列表两种实现方式。并发
1.指针碰撞法
假设Java堆中内存时完整的,已分配的内存和空闲内存分别在不一样的一侧,经过一个指针做为分界点,须要分配内存时,仅仅须要把指针往空闲的一端移动与对象大小相等的距离。使用的GC收集器:Serial、ParNew,适用堆内存规整(即没有内存碎片)的状况下。post
2.空闲列表法
事实上,Java堆的内存并非完整的,已分配的内存和空闲内存相互交错,JVM经过维护一个列表,记录可用的内存块信息,当分配操做发生时,从列表中找到一个足够大的内存块分配给对象实例,并更新列表上的记录。使用的GC收集器:CMS,适用堆内存不规整的状况下。学习
内存分配并发问题线程
在建立对象的时候有一个很重要的问题,就是线程安全,由于在实际开发过程当中,建立对象是很频繁的事情,做为虚拟机来讲,必需要保证线程是安全的,一般来说,虚拟机采用两种方式来保证线程安全:指针
若是想多了,建立一个对象仍是挺麻烦的,须要这么多步骤,那么咱们在开发过程当中尽可能非必须的对象建立呢?对象
建立对象有如下几个要点:内存
学习前人笔记,记录一下!开发
参考:get