JVM内存划分

JVM内存区域

  1. 程序计数器(线程私有)
    程序计数器是一块比较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。
    如果当前线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执
    行的是一个Native方法,这个计数器值为空。
    程序计数器内存区域是唯一一个在JVM规范中没有规定任何OOM情况的区域!
  2. 栈(线程私有)
    虚拟机栈描述的是Java方法执行的内存模型 : 每个方法执行的同时都会创建一个栈帧用于存储局部变量表、操作数
    栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应一个栈帧在虚拟机栈中入栈和出
    栈的过程。声明周期与线程相同。
  3. 堆(线程共享)
    Java堆(Java Heap)是JVM所管理的最大内存区域。Java堆是所有线程共享的一块区域,在JVM启动时创建。此内存
    区域存放的都是对象实例。JVM规范中说到:“所有的对象实例以及数组都要在堆上分配”。
    Java堆是垃圾回收器管理的主要区域,因此很多时候可以称之为"GC堆"。根据JVM规范规定的内容,Java堆可以处
    于物理上不连续的内存空间中。Java堆在主流的虚拟机中都是可扩展的(-Xmx设置最大值,-Xms设置最小值)。
    如果在堆中没有足够的内存完成实例分配并且堆也无法再拓展时,将会抛出OOM
  4. 方法区(线程共享)
    此区域的内存回收主要是针对常量池的回收以及对类型的卸载
  5. 运行时常量池(方法区一部分)
    运行时常量池是方法区的一部分,存放字面量与符号引用。
    字面量 : 字符串(JDK1.7后移动到堆中) 、final常量、基本数据类型的值。
    符号引用 : 类和结构的完全限定名、字段的名称和描述符、方法的名称和描述符

基本数据类型和引用数据类型

基本数据类型是创建在栈中
而引用数据类型比如String,String对象是在栈中,而对象的值是指向堆中的一片区域

类的加载

什么时候会用到类的加载?
用到一个类但是不在内存中的时候
什么时候用到一个类
构造对象、调用静态属性/方法、子类触发父亲(接口)
初始化顺序:类的初始化、对象的初始化

加载顺序:
父类:永远先于子类
类:静态代码块按书写顺序执行
对象:构造代码块在构造方法之前,多个构造代码块按照书写顺序执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值