《深入理解jvm》读书笔记

第2章 java内存区域和内存溢出异常

1、运行时数据区域

  1. pc程序计算器,内存区域中唯一没有内存溢出的区域,当前程序所执行的字节码的行号指示器;
  2. java虚拟机栈,和pc一样也是线程私有,存放局部变量表,虚拟机栈执行的是java方法;
  3. 本地方法栈,执行的是nativa方法服务;
  4. java堆,被所有线程共享的一块内存区域;
  5. 方法区:和java堆一样,各个线程共享,用于存储被虚拟机加载的类信息,静态变量,常量,即使编译后的代码;其中方法区中包含常量池存放类的模板,字段,方法,接口等描述信息,此类荣在类加载后进入方法区的常量池;

2、对象的创建过程

执行new的指令的时候,首先会将这个指令的参数是否可以在常量池中找到,如果没有被加载解析和初始化过,先执行类加载过程;

否则在堆中分配内存,分配的方式包括,指针碰撞、维护空闲列表方式,

当然在,分配的过程中,除了分配方式,还涉及到多线程,

TLAB向本地限次分配缓冲,哪个线程需要分配内存,则在哪个线程TLAB上执行

 

3、对象的内存布局

对象头;Hotspot虚拟机的对象头,分为两个部分, 一个部分是存储对象自身的运行时数据,如hashcode,gc分代信息(MarkWord);另一个部分是类型指针,即对象指向他的类元数据的指针

实例数据:对象存储的真正信息

对齐填充:

 

 

4、对象的访问定位

通过java虚拟机栈中存放的reference信息指向java堆中的对象实例信息,对象实例信息中包含了指向方法区中的对象类的类型数据;

 

5、几种常见的异常溢出

  1. java堆溢出:-xms  \ -xmx最大堆和最小堆设置成为一样可以避免堆的自动扩展
  2. 虚拟机栈溢出:-xss  ,栈深度

 

6、字节码文件结构:

class文件格式:

package org.fenixsoft.clazz;

public class TestClass {
    
    private int m;

    public int inc() {
        return m + 1;
    }

}

【0-3】magic 4个字节 魔数 0xcafebabe

【4-5】 0x0000 minor version 2个字节 次要版本

【6-7】 0x0034 major verison 2个字节 52 jdk 1.8版本;

【8-9】 0x0013 constan_pool_count 常量池数量  2个字节;

 

 

 

7、虚拟机类加载机制

类加载的时机、过程、类加载器

时机:

加载、(验证、准备、解析)、初始化、使用、卸载;括号类的代表连接的过程

有且只有4中情况立即对类初始化

1、遇到new\get\setStatic、或invokestatic这4个字节的时候

2、当初始化一个类发现父类还没初始化

3、发射调用的时候

4、main 会先初始化

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值