zoukankan      html  css  js  c++  java
  • 探究JVM

    JVM

      java虚拟机的缩写,是一个虚构的虚拟机

    组成:

      ·类装载器: 用来装载.class 文件

      ·执行引擎: 执行字节码文件或者执行本地方法

      ·运行时数据区: 

        ~方法区:     

          线程共享
          存储已被虚拟机加载的类信息、常量、静态变量、编译后的代码
          GC少见

        ~堆: 

          线程共享内存区
          虚拟机启动时创建
          存放对象实例
          可以处于逻辑上连续 物理上不连续的内存空间
          可以固定大小,也可以用作扩展

        ~栈:

          线程私有,生命周期与线程相同
          线程创建的同时同时会创建JVM栈
          方法调用完成的过程就是栈帧从虚拟机入栈到出栈的过程
          局部变量表所需要的内存在编译时分配
          栈可以存放的基础数据类型:(int long double float short byte char boolean)
          栈溢出:
            条件:栈深度大于虚拟机允许的深度
            解决办法: 1、调整线程栈的大小 2、越大线程总数越少 3、越少线程总数越大   

        ~PC寄存器:
          存储每个线程下一步执行的JVM指令
          如果该方法为native方法,PC寄存器不会存储信息
        ~本地方法栈:
          执行虚拟机用到的native方法。
          与虚拟机的区别:本地方法栈是给虚拟机用的;虚拟机栈是给Java程序用的

      ·GC(垃圾回收模块):
        方式: 复制删除法;标记删除法;标记整理法
        gcroot:
          gc的类:
            废弃的常量
            无用的引用
            无用的类(所有的实例都被回收;classload已被回收、没有任何地方引用、无法通过反射访问)
          不gc的类:
            虚拟机栈中的引用对象
            方法区: 类变量、常量
            本地方法栈中的对象引用
      ·jvm三种加载类:
        home: java.lang
        ext: 自主体
        y应用程序加载器
      ·java程序的执行过程:
        1.加载类 获取类的二进制字节流,将其转换为方法区的运行时数据结构
        2.分配内存 校验文件格式,元数据验证,字节码验证,符号引用验证
        3.初始化数据
          在方法区中对类的static变量分配内存并设置变量数据默认值
          不包括变量实例,实例变量会在对象实例化的时候一起分配到java堆中
        4.设置对象头 将常量池中内的符号引用替换成直接引用的过程
        5.执行init方法 为类的静态变量赋予正确的初始值

  • 相关阅读:
    TREEVIEW拖拽对应修改目录
    shell脚本总结
    Linux将程序添加到服务的方法(通用【但最好还是用systemd】)
    Git客户端命令总结
    如何设置vim中tab键缩进---配置初始化设置
    在终端上创建Java项目及编译和运行
    Linux下Git安装及配置
    如何在eclipse的配置文件里指定jdk路径
    Redis总结和提取常用的和重要的命令
    Redis为什么是单线程
  • 原文地址:https://www.cnblogs.com/joey-413/p/13976614.html
Copyright © 2011-2022 走看看