从class到对象

一、JVM运行时数据区
从class到对象_第1张图片
运行时数据区.png
  • 程序计数器
    当前线程所执行字节码行号指示器,唯一一个没有OOE的区域
    线程切换后能恢复到正确的执行位置
  • 虚拟机栈
    生命周期和线程一致,描述java方法执行的内存模型:每个方法执行时都会创建一个栈帧(Stack Frame) ,用于存储局部变量表、操作数栈、动态链接、方法出入口等信息。每一个方法从调用到执行完成,就对应着一个栈帧在虚拟机栈中入栈到出栈。
  • 本地方法栈
    为JVM使用到的Native方法服务。
  • java堆
    线程共享的区域,此内存区域的唯一目的就是存放对象实例。所有对象实例及数组都要在堆上分配。
    从内存回收角度:堆 = 新生代(Eden + From Survivor + To Survivor) + 老生代。
    从内存分配角度:堆中可能划分出多个线程私有的分配缓冲器(TLAB)。
-Xmx:最大可用堆空间      -Xms:初始分配空间
-Xmn:年轻代空间          -Xss:每个线程堆栈大小
  • 方法区(也称永久代)
    用于存放已被JVM加载的类信息、常量、静态变量等。
    运行时常量池是方法区的一部分,对应于Class文件中的常量池

注:String.intern()
native方法,如果字符串常量池中已包含,就返回其引用,否则加入到常量池中,再返回引用。

  • 1.6中,会把首次遇到的字符串复制到永久带,返回永久代的引用
  • 1.7后,intern方法不再复制,只是在常量池中记录首次出现的引用。(估计这样,由于永久代有引用,所以字符串不会被回收,变相成为一个常量,并且不占用永久代空间)
二、对象的创建

JVM遇到new指令:

  1. 首先检查能否在常量池中定位到类的符号引用,并检查符号引用代表的类是否已被加载,解析和初始化。
  2. 然后为对象分配内存
  3. 分配内存之后JVM会将内存空间都初始化为零值(不包括对象头)。
  4. JVM对对象进行必要设置
    对象是哪个类的实例、类型指针(指向元数据)、对象的Hash码、对象的GC分代年龄、锁状态标志、线程持有的锁、偏向线程id、偏向时间戳等,这些信息存放在对象头
  5. 执行方法


    从class到对象_第2张图片
    图片1.png

你可能感兴趣的:(从class到对象)