jvm

Posted wang2386033566

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jvm相关的知识,希望对你有一定的参考价值。

一.运行时数据区

  1.线程共享和线程私有:

    01.线程共享:

       堆,方法区

    02.线程私有:

       虚拟机栈,本地方法栈,程序计数器

  2.程序计数器

    当前线程执行字节码文件的行号指示器

    能够在线程切换之后,找到自己正确的位置

    是唯一一个不会导致内存泄漏(OutOfMemory,OOM)的区域

  3.虚拟机栈:

    基本数据类型的变量和对象的引用变量都存在此区域;

    遵循“先进后出,后进先出”

  StackOverFlowError:

    线程请求的栈深度大于了虚拟机规定的最大深度

  OutOfMemoryError:

    虚拟机在扩展栈时,无法申请到足够的内存空间!

 

  4.本地方法栈

    主要服务于Native修饰的方法

    在HotSport中虚拟机栈和本地方法栈合为一体

 堆:

  所有对象的实例和数组开辟空间都在此区域保存!

  所有线程共享

  GC主要回收对象的区域

 1.堆分区:新生代,老年代,永久代

 2.方法区(静态去)

   所有线程共享;

   方法(包含构造函数),接口 定义在此区域;

   所有方法的信息

   静态变量+常量+类信息+方法信息+常量池 

 

二.类的生命周期:

  类的生命周期从类被加载,连接和初始化开始到类的卸载结束

   01.类的生命周期中,类的二进制位于方法区;

   02.在堆中会有一个描述这个类的Class对象;

  2.1加载将class字节码文件内容加载到内存中,并将这些静态数据转换成方法区中运行时数据结构,在堆中生成一格Class对象;这个Class对象就是方法区类数据的访问入口

  2.2链接

   0.1类的验证

    001.类文件的结构检查

    002.语义检查 比如说final修饰的变量在编译期间发现再次赋值

    003.字节码验证,确保字节码能被jvm识别

   0.2类的准备

    为类中所有static修饰的内容开辟空间,并赋予初始值!!

    static  int  num=100;

    这时候 num=0;

   0.3类的解析

    符号引用:就是用字符串的形式来表示某个变量或是类,我们能看懂String a="a"; Student stu=new Student();

    直接引用:是根据符号引用翻译出来的地址!

   2.3 初始化

    加载不是初始化

    初始化指的是实例化!创建出类的实例!

    初始化的时机

     01.类的主动引用

      001.new一个类的对象

      002.通过反射的newInstance();

      003.再初始化子类时候必须先初始化父类

     02.类的被动引用

      001.通过类名访问静态内容

      002.调用类的静态常量也会不会初始化类

      003.用类作为对象数组存在时,也不会初始化类

      004.子类调用父类的静态变量不会加载子类的静态代码块(不会执行类的准备阶段)

 

以上是关于jvm的主要内容,如果未能解决你的问题,请参考以下文章

jvm基础--JVM参数配置

jvm基础--JVM内存模型

jvm基础--JVM内存模型

JVM基础:深入学习JVM堆与JVM栈(转)

JVM堆与JVM栈

JVM内存管理和JVM垃圾回收机制