《深入理解java虚拟机》- 01 java内存区域

1、运行时数据区


运行时数据区

1.1 PC Register (程序计数器)

(1) 记录当前线程所执行字节码的行号,字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令

(2) 每个线程都有一个独立的程序计数器

(3) 如果是java方法,记录的是正在执行的字节码指令地址;如果是native方法,计数器的值为空

(4) 唯一没有规定OutOfMemoryError的区域

JVM Stack (java虚拟机栈)


java虚拟机栈

(1) 线程私有,生命周期与线程相同

(2) 虚拟机栈描述的是java方法执行的内存模型,每个方法在执行的同时创建一个栈帧(Stack Frame),方法从调用到执行完成,对应栈帧从入栈到出栈

(3) 栈帧:包括局部变量表、操作数栈等

(4) 两种异常:StackOverflowError和OutOfMemoryError

1.3 Native Method Stack(本地方法栈)

(1) 与JVM Stack类似,主要区别是本地方法栈为native方法(c/c++)服务

1.4 Heap(堆)

(1) 所有线程共享的区域

(2) 存放对象实例和数组,是GC管理的主要区域

(3) 通过-Xmx和-Xms控制是否可扩展

(4) 如果堆中没有足够内存,且无法扩展,将抛出OutOfMemoryError异常

1.5 Method Area(方法区)

(1) 所有线程共享的区域

(2) 存放类信息、常量、静态变量、即时编译器编译后的代码等

(3) GC在该区域主要是常量池的回收和类型的卸载,回收效果难尽如人意

(4) 当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常

1.6 Runtime Constant Pool(运行时常量池)

(1) 属于方法区的一部分

(2) 存放编译期生成的各种字面量和符号引用

(3) 不同供应商可以按自己的需求实现这个区域

1.7 Direct Memory(直接内存)

(1) 不属于jvm运行时数据区

(2) 可以使用native函数库直接分配堆外内存,通过java堆中的DerectByteBuffer对象作为这块内存的引用进行操作

(3) 容易忽略直接内存导致的OutOfMemoryError异常

2、hotspot虚拟机对象探秘

2.1 对象的创建

(1) 类加载检查:虚拟机遇到new指令时,首先检查该指令的参数是否能在常量池中定位到一个类的符号引用,并检查该符号引用代表的类是否已被加载、解析和初始化过,如果没有,必须先进行类加载操作

(2) 为新生对象分配内存,指针碰撞(Serial、ParNew):内存绝对规整,用过的内存放一边,空闲的内存放另一边,分配内存将指针向空闲内存挪动对象大小的空间;空闲列表(CMS):内存不规整,虚拟机通过维护一个列表记录可用内存

(3) 虚拟机创建对象的线程安全问题:一种是CAS+失败重试,另一种是按线程划分到不同空间中,每个线程在堆中预先分配一小块内存TLAB(Thread Local Allocation Buffer),然后在线程的TLAB上分配

(4) 内存分配完成后,需要将分配到的内存空间初始化为零值

(5) 设置对象头,包括这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的GC分代年龄等信息

2.2 对象的内存布局

(1) 对象的内存布局分为3块区域:对象头(Header)、实例数据(Instance Data)、对齐填充(Padding)

(2) 对象头包括两部分:第一部分用于存储对象自身的运行时数据(Mark Word),包括哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等;另一部分是类型指针(元数据不需要),通过该指针确定对象是哪个类的实例;如果对象是数组,对象头还有一部分需记录数组的长度

2.3 对象的定位访问

(1) 句柄访问:在堆中划分出一块内存作为句柄池,reference中存储的是对象的句柄地址,句柄中包含了对象实例数据和对象类型数据

句柄访问


(2) 直接指针访问:reference存储的是对象地址

(3) 句柄访问的优势是,reference存储的是稳定的句柄地址,当对象被移动(GC时移动对象)时只会改变句柄中的实例数据指针,reference本身不需要修改;直接指针访问的优势是,速度更快,它节省了一次指针定位的开销,hotspot使用的是直接指针访问

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容