• 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实例

  • 相关阅读:
    python unittest一个简单的实例
    解决python编码格式错误问题
    一个简便的方法,获取某个页面元素的Xpath值
    Xpath基础语法学习
    postman发送带cookie的http请求
    postman测试接口之POST提交本地文件数据
    使用Jmeter录制web脚本
    mac 之 jmeter下载、解压、启动
    第三方测评公司的一些基础理念
    jmeter简单的压测案例——访问百度并发5,持续请求15
  • 原文地址:https://www.cnblogs.com/wardensky/p/4162121.html
Copyright © 2020-2023  润新知