专栏名称: ImportNew
伯乐在线旗下账号,专注Java技术分享,包括Java基础技术、进阶技能、架构设计和Java技术领域动态等。
目录
相关文章推荐
芋道源码  ·  Spring项目中用了这种模式,经理对我刮目相看 ·  1小时前  
黑马程序员  ·  Java革命,来了! ·  5 小时前  
芋道源码  ·  我用这11招,让接口性能提升了100倍 ·  2 天前  
芋道源码  ·  2W字全面剖析 Mybatis 中的9种设计模式 ·  2 天前  
51好读  ›  专栏  ›  ImportNew

JVM 内存的那些事

ImportNew  · 公众号  · Java  · 2017-03-03 20:48

正文

请到「今天看啥」查看全文



JAVA虚拟机把管理的内存划分为几个不同的数据区。



Java堆


Java堆是被所有线程共享的一块内存区域,主要用于存放对象实例,Java虚拟机规范中有这样一段描述:所有的对象实例和数据都要在堆上进行分配。为对象分配内存就是把一块大小确定的内存从堆内存中划分出来,通常有两种方法实现:


1 、指针碰撞法


假设Java堆中内存时完整的,已分配的内存和空闲内存分别在不同的一侧,通过一个指针作为分界点,需要分配内存时,仅仅需要把指针往空闲的一端移动与对象大小相等的距离。


2、空闲列表法


事实上,Java堆的内存并不是完整的,已分配的内存和空闲内存相互交错,JVM通过维护一个列表,记录可用的内存块信息,当分配操作发生时,从列表中找到一个足够大的内存块分配给对象实例,并更新列表上的记录。


对象创建是一个非常频繁的行为,进行堆内存分配时还需要考虑多线程并发问题,可能出现正在给对象A分配内存,指针或记录还未更新,对象B又同时分配到原来的内存,解决这个问题有两种方案:


  1. 采用CAS保证数据更新操作的原子性;


  2. 把内存分配的行为按照线程进行划分,在不同的空间中进行,每个线程在Java堆中预先分配一个内存块,称为本地线程分配缓冲(Thread Local Allocation Buffer, TLAB);


Java栈


Java栈是线程私有的,每个线程对应一个Java栈,每个线程在执行一个方法时会创建一个对应的栈帧(Stack Frame),栈帧负责存储局部变量变量表、操作数栈、动态链接和方法返回地址等信息。每个方法的调用过程,相当于栈帧在Java栈的入栈和出栈过程。







请到「今天看啥」查看全文