• 对于java虚拟机的整个信息的整理如下,这是在看了多个博客和教程之中总结出来的,博客有很多存在错误,因此我主要还是以教程为主要参考,自己每次都找不到笔记,所以还是发出来比较好找


    对于java虚拟机的整个信息的梳理

    以下梳理均是java8之后虚拟机的情况

    • 首先是模型图

    • Class Loader类加载器 :

      负责加载class文件,class文件在文件开头有特定的文件标示,并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定
    • Method Area 方法区

      方法区是被所有线程共享,所有字段和方法字节码,以及一些特殊方法如构造函数,接口代码也在此定义。简单说,所有定义的方法的信息都保存在该区域,此区属于**共享区间**

      静态变量+常量+类信息+运行时常量池存在方法区中,实例变量存在堆内存中
    • PC Register 程序计数器

      每个线程都有一个程序计数器,就是一个指针,指向方法区中的方法字节码(下一个将要执行的指令代码),由执行引擎读取下一条指令,是一个非常小的内存空间,几乎可以忽略不记。
    • Native Method Stack 本地方法栈

      它的具体做法是 Native Method Stack中登记native方法,在Execution Engine 执行时加载native libraies。
    • 栈管运行,堆管存储

    • Stack 栈是什么

      栈也叫栈内存,主管Java程序的运行,是在线程创建时创建,它的生命期是跟随线程的生命周期,线程结束栈内存也就释放,对于栈来说不存在垃圾回收问题,只要线程一结束该栈就Over,生命周期和线程一致,是线程私有的。

      基本类型的变量和对象的引用变量都是在函数的栈内存中分配。
    • 栈存储什么?

      栈帧中主要保存3 类数据:

      本地变量(Local Variables):输入参数和输出参数以及方法内的变量;

      栈操作(Operand Stack):记录出栈、入栈的操作;

      栈帧数据(Frame Data):包括类文件、方法等。
    • jvm优化是优化方法区和堆

    • 养老区

      养老区用于保存从新生区筛选出来的 JAVA 对象,一般池对象都在这个区域活跃。
    • JVM规范将方法区描述为堆的一个逻辑部分,但它还有一个别名叫做Non-Heap(非堆),目的就是要和堆分开

    • 运行时常量池放在方法区中

    • 字符串常量池放在堆中

    • java8后,堆在逻辑上被分为新生区+养老区+元空间

      java8后,用元空间实现了方法区

      java8后,元空间属于本地内存,不能存在与虚拟机中(类的元数据放在元空间中)

      java8后,jvm将方法区描述为堆的一个逻辑部分

    • 在对象初始化之前会把类文件加载到方法区,类中定义的静态常量是放在运行时常量池,引用静态常量不会触发此类的初始化(常量在连接阶段就存入调用类的常量池中了)

      

  • 相关阅读:
    percona-toolkit
    使用pt-query-digest,找到不是很合适的sql
    linux_添加定时任务,每5min清理下某个文件夹下的文件
    dotTrace快速帮助你定位C#代码的性能瓶颈
    性能测试问题_tomcat占用内存很高,响应速度很慢
    性能分析_linux服务器CPU_中断
    性能分析_linux服务器CPU_CPU利用率
    性能分析_linux服务器CPU_Load Average
    LR_问题_虚拟用户以进程和线程模式运行的区别
    truncate,delete,drop的区别
  • 原文地址:https://www.cnblogs.com/skyvalley/p/13959085.html
Copyright © 2020-2023  润新知