JVM阅读笔记之Java内存区域与对象的创建

一、运行时数据区域

1、程序计数器(每条线程都需要有一个独立的程序计数器,字节码行号指示器)
2、Java虚拟机栈(线程私有,生命周期与线程相同,每个方法执行时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接等)
3、本地方法栈(与Java虚拟机相似,只是他存放Native方法执行时数据)
4、Java堆(所有线程共享,存放内存实例,分为新生代和老生代)
5、方法区(线程共享,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等)
6、运行时常量池(方法区的一部分,存放编译器生成的各种字面量和符号引用)
7、直接内存(堆外内存,是本地直接内存的分配,不受堆大小限制,)

二、对象的创建

虚拟机遇到new指令是,先检查指令参数是否能在常量池中定位到一个类的符号引用并检查这个符号应用代表的类是否已被加载、解析和初始化过没有的话执行类加载过程,通过后虚拟机将为新生对象分配内存,然后虚拟机将分配到的内存空间都初始化为零(不包括对象头)然后虚拟机要对对象进行设置(对象头信息设置),接着执行init方法,把对象按照程序员的意愿进行初始化,对象创建完成。

三、对象在内存中存储的布局

1、对象头(一部分存储对象自身的运行时数据如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,另一部分是类型指针,即对象指向它的类元数据的指针)
2、对象真正存储的有效信息
3、对齐填充,没特别含义

四、对象访问定位

想要操作堆上的具体对象需要通过Java栈上的reference数据来操作,器访问方式有两种:
1、句柄:采用句柄时Java堆会划分一块内存来作为句柄池,reference中存储的就是对象的句柄地址,句柄中包含对象实力数据与类型数据各自具体地址(优点:GC时移动对象只改变句柄地址,不用改变reference地址)
2、直接指针:采用直接指针访问时Java堆对象的布局中就必须考虑如何放置访问类型数据相关信息,此时reference直接存放对象地址(优点:节省了一次指针定位的时间,访问速度更快)

五、参数设置

-Xms堆的最小值、-Xmx堆的最大值 -Xss设置栈容量 PermSize和MaxPermSize设置方法区大小 -MaxDirectMemorySize设置本机直接内存

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值