zoukankan      html  css  js  c++  java
  • JVM备忘点(1.8以前)

    1.内存结构

    左边两个线程共享,右边三个线程私有。

    方法区:.class文件的类信息、常量、static变量、即时编译器编译后的代码(动态代理)。HotSpot将方法区称为永久代

    堆:分为新生代和老年代,或分为Eden、FromSurvior、ToSurvvivor。存放了类和数组对象。当堆无法扩展且堆内没有空间分配给实例时,抛出OutOfMemoryError。

    栈:由一个个栈帧组成。每次方法调用都会产生一个栈帧,调用结束后释放这个栈帧。栈帧包含了局部变量表、操作数栈、动态链接、方法出口。

      局部变量表存放的是在方法中声明的8种基本数据类型、对象的引用(指向堆中的引用)、返回值的引用(也指向堆中的引用)。其中long和double占2个单位的空格键

      操作数栈是栈帧内部的一个栈结构,Deolin认为它的作用是基于字节码指令进行计算,运算数被压进栈底,结果值从栈顶弹出。

      动态链接,存放由.class文件中的符号引用转化而来的直接引用,这两种引用都是用来指向方法中 调用的其他方法,或是其他的域。

    本地方法栈:与虚拟机栈类似,它是为Native方法服务的。

    程序计数器:很小的空间,显示当前线程执行到的字节码行号。

    2.类加载

    -> 把.class文件以二进制的形式读到方法区

    -> 在堆上创建一个java.lang.Class对象,用于封装上一步中读入的信息,让它们成为方法区内的数据结构

    -> 类加载的最终产物是堆中的java.lang.Class对象

    3.类的生命周期

    类加载

    连接

      验证:检查文件格式,检查语法,比如方法内声明的final变量,不能再赋值

      准备:为静态域分配内存(堆),并设置为默认初始值(无论代码中是否赋了初值,这一步都会赋诸如null, 0, 0L之类的值)

      解析:把符号引用转换为直接引用

    出现以下情况时,类进行初始化

    创建该类的实例时(new、反射、克隆、反序列)

    调用该类的静态方法,访问该类的静态域

    调用java.lang.Class<该类>的方法时

    main(Stirng[])方法

    初始化该类的子类时

    初始化

      有父类的话,先初始化父类。

      执行静态代码块,并为静态域分配代码层面定义的初值(这两者的顺序取决与代码中出现的先后顺序)

    使用类实例化时,紧接着初始化之后

      有父类的话,先对父类进行1.2.3.步

      1.为域分配空间,初始化

      2.执行构造代码块

      3.构造方法

      这一步结束后堆中存在了实例化后的对象,当前栈帧的局部变量变量表中存在了指向这个对象(堆中)的引用

    当满足以下所有条件时,类会被卸载

    该类的所有对象都被垃圾回收(GC)

    加载该类的类加载器被GC

    没有引用指向java.lang.Class<该类>的实例

    卸载

      类在方法区的数据结构被移除

    4.各种数据字段在JVM中的内存位置

    对象、数组      堆

    基本数据类型的域   堆(因为非静态域无法独立于对象存在,所以跟对象一起在堆中,而且是线程不安全的)

    基本数据类型的变量  栈(因为线程安全,栈帧出栈了以后被销毁)

    final域        方法区(“常量”在方法区)

    final变量       栈(这个问题在知乎问过,答案是final仅仅在编译器提供对修饰变量的约束,使其无法改变引用,但是本质与普通变量无异)

    ※ 总结来看,无论什么变量(在方法中申明的局部变量),都是存储在栈帧的局部变量表中的。

  • 相关阅读:
    整合了一个命令行程序的框架
    CentOS下mysql数据库data目录迁移和配置优化
    关于华硕主板的图像输出设置
    在jetson tx1下编译安装opencv3.2的一点小总结
    安装pydev 但是没有pydev工程选项
    关于PID控制的认识
    notebook( office + matlab)
    vmware 后台运行不能恢复
    将必应设置成chrome的默认搜索引擎
    centOS 7 apache 不能访问
  • 原文地址:https://www.cnblogs.com/deolin/p/7072723.html
Copyright © 2011-2022 走看看