我们在进行Java开发的时候,很少关心Java的内存分配等等,因为这些活都让JVM给我们做了。不仅自动给我们分配内存,还有自动的回收无需再占用的内存空间,以腾出内存供其他人使用。但是我们经常面临的一个问题就是内存泄漏,JVM无法完成回收工作,导致内存占用暴涨,最后可能让程序奔溃。本章主要了解下运行时数据区域分布情况以及溢出异常。
说明: 本系列多处摘抄《深入理解Java虚拟机》中内容,主要精简了本书的要点,并叙述自己对本书的理解。本人才疏学浅,文章中有不对的地方,还望批评指教。
程序运行时,需要不停的将数据在内存中分配、计算等。JVM将不同类型的数据放在不同的位置,这样分工才能够让程序有序的跑起来。我们所定义的方法,以及new的对象实例都分别存在方法区和堆中,这两个区域是属于内存共享的地方,也就是说任何线程取的都是一样的。但是,因为有线程的存在。所以,我们需要给线程必要的私有空间。故,在程序运行的时候,我们通过栈来保存该线程自由的局部变量、引用等,通过程序计数器保存了各个线程的执行位置。这样,在线程切换的时候,才能找到自己的上一次执行位置,继续完成未完成的工作。如果,程序执行过程中没有足够的空间分配,就报对应的OOM异常。
小贴士
本文由原作者井方哥独家授权Open软件开发小组发布,著作权归原作者所有。如需转载请联系原作者申请授权。