• Jvm基础(1)-Java运行时数据区


    最近在看《深入理解Java虚拟机》,里面讲到了Java运行时数据区,这是Jvm基本知识,把读书笔记记录在此。这些知识属于常识,都能查到的,如果我有理解不对的地方,还请指出。

    首先把图贴上来,图来自JVM Runtime Data Areas(运行时数据区),感谢。

    由上图可知,Java运行时数据区域包括程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。

    1. 程序计数器

    程序计数器用来记录下一条字节码指令,因为CPU是要轮转的,在切换回来之后,Java能够找到下一条要执行的指令。如果是多线程程序,那么,每一个线程会有一个独立的程序计数器。【我疑惑的是不知道这个具体怎么设计的,如果一个有几十万线程的程序会不会有问题?】此内存区域是唯一一个不定义OutOfMemoryError的区域。

    另外,比较好玩的是,其英文是Program Counter Register,说到底是一个寄存器,翻译成计数器有点不准确。

    2.Java虚拟机栈

    Java虚拟机栈就是平常说的栈,我理解栈主要存储方法相关的内容,如方法参数、方法中局部变量等。调用方法时,内容压入栈中,方法返回时,从栈中弹出。栈里面还细分为局部变量区、操作数栈、动态连接等。其中局部变量区存储了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用等。其中64位长度的long和double类型的数据会占用2个局部变量空间(Slot),其余的数据类型只占用1个。【这个要特别注意,这个会引起一个线程同步的问题】

    3.本地方法栈

    本地方法指的是Java实现不了,用C或C++实现的方法。关于本地方法,请参考java native方法及JNI实例

    4.Java堆

    Java堆是最值得关注的地方,因为这个地方经常抛出内存不足的异常。【我在项目中就遇到过很多次,都是内存泄漏的问题】

    Java堆是代码里面存放变量的地方,比如定义了一个字符串,那么其真实地址就存在堆中。Java堆可以分为新生代(New Generation)和老年代(Old Generation/Tenuring Generation),有的又分为Eden空间、From Survivor空间、To Survivor空间等。其主要思想与Java GC有关系,即大部分对象的存活时间都比较短,如果某一个对象存活时间比较长,就把他移到另外一个区域。这样做GC的成本比较低。【关于这个话题,我会单独写一篇】

    5.方法区

    方法区存储的是类的一些基本信息,如类的常量池、静态变量等。【标准说法是:类及其父类的全限定名(java.lang.Object没有父类)、类的类型(Class or Interface)、访问修饰符(public, abstract, final)、实现的接口的全限定名的列表、常量池、字段信息、方法信息、静态变量、ClassLoader引用、Class引用】

    可以这样理解,如果定义了一个类,其中有一个静态变量,那么在new这个类的时候,静态变量会放在方法区,实例的其它部分会放在Java堆;如果又new了这个类,那么方法区的静态变量不变,在Java堆里面会有一块新的内存放实例。

    以上就是Java运行时数据区,了解这部分内容会对后续的学习(如GC)有一定的帮助。

    参考:

    《深入理解Java虚拟机》

    JVM Runtime Data Areas(运行时数据区)

    浅析Java虚拟机结构与机制

    java native方法及JNI实例

  • 相关阅读:
    corntab e 执行sql脚本
    Java批量操作及分页
    log4j.xml和log4j2.xml配置应用日志与业务日志分离
    如何将vue项目部署到nginx服务器
    从零搭建Pytorch模型教程(四)编写训练过程参数解析
    STM32Cumebx HAL库实现STM32 USB虚拟串口的收发
    js 判断数据类型的几种方法
    Win10 电脑右下角任务栏网络图标突然消失解决方案
    Navicat Premium 16 永久破解激活
    788. 逆序对的数量
  • 原文地址:https://www.cnblogs.com/wardensky/p/4162121.html
Copyright © 2020-2023  润新知