美文网首页
从class到对象

从class到对象

作者: FightForFuture | 来源:发表于2019-01-22 19:48 被阅读0次
一、JVM运行时数据区
运行时数据区.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. 执行<init>方法


    图片1.png

相关文章

  • 从class到对象

    一、JVM运行时数据区 程序计数器当前线程所执行字节码行号指示器,唯一一个没有OOE的区域线程切换后能恢复到正确的...

  • 从.java到.class

    一、class 类文件 class文件是一组以8位字节为基础的二进制流,中间没有任何分隔符,所以数据的含义和顺序都...

  • ★12.类型信息

    Class 每个类都有Class对象。 获取Class对象的方式有:类名.class对象.getClass()Cl...

  • OC对象的分类

    instance(实例对象)instance class(类对象)class meta-class(元类对象)me...

  • oc对象的种类

    oc对象:instance对象,class对象,meta-class 对象 instance对象 isa 其他成员...

  • 02 OC对象的分类

    instance对象(实例对象) class对象 (类对象) meta-class对象 (元类对象) instan...

  • 02.Objective-C 对象的分类

    问题 Objective-C对象分类 整么获取到class对象,整么获取到meta-class对象 class对象...

  • OC对象的分类

    OC对象主要分为3种: instance对象(实例对象) class对象 (类对象) meta-class对象 (...

  • OC 对象的种类

    分类 instance 对象(实例对象) class 对象(类对象) meta-class 对象 (元类对象) i...

  • java 泛型方法的两种写法

    这种需要传入 类名.class(class对象)(java有两类对象,Class对象和实例对象。更多参考Java的...

网友评论

      本文标题:从class到对象

      本文链接:https://www.haomeiwen.com/subject/rmakdqtx.html