最近在看《深入理解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实例

Jvm基础(1)-Java运行时数据区的更多相关文章

  1. JVM 专题十:运行时数据区(五)堆

    1. 核心概述 1.1 堆概述 一个进程对应一个jvm实例,一个运行时数据区,又包含多个线程,这些线程共享了方法区和堆,每个线程包含了程序计数器.本地方法栈和虚拟机栈. 一个jvm实例只存在一个堆内存 ...

  2. 【JVM第三篇--运行时数据区】程序计数器、虚拟机栈、本地方法栈

    写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.运行时数据区 我们在编写Java程序时,使用JVM的流程主要如下所示: 虚拟机在 ...

  3. 读书笔记-浅析Java运行时数据区

    作为一个 Java 为主语言的程序员,我偶尔也需要 用 C/C++ 写程序,在使用时让我很烦恼的一件事情就是需要对 new 出来的对象进行 delete/free 操作,我老是担心忘了这件事情,从而导 ...

  4. JVM系列之四:运行时数据区

    1. JVM架构图 Java虚拟机主要分为五大模块:类装载器子系统.运行时数据区.执行引擎.本地方法接口和垃圾收集模块. 2. JDK1.7内存模型-运行时数据区域 根据<Java 虚拟机规范( ...

  5. 【JVM第四篇--运行时数据区】堆

    写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.堆的概述 JVM的运行时数据区如下: 一个Java程序运行起来对应着一个进程(操 ...

  6. Java 运行时数据区和内存模型

    运行时数据区是指对 JVM 运行过程中涉及到的内存根据功能.目的进行的划分,而内存模型可以理解为对内存进行存取操作的过程定义.总是有人望文生义的将前者描述为 "Java 内存模型" ...

  7. Java运行时数据区

    目录 1. 概述 2. Java内存结构 3. 程序计数器 4. Java虚拟机栈 5. 本地方法栈 6. 堆 7. 方法区 8. 运行时常量池 9. 直接内存 10. 总结 1. 概述 作为日常的J ...

  8. 【转】Java运行时数据区简介及堆与栈的区别

    理解JVM运行时的数据区是Java编程中的进阶部分.我们在开发中都遇到过一个很头疼的问题就是OutOfMemoryError(内存溢出错误),但是如果我们了解JVM的内部实现和其运行时的数据区的工作机 ...

  9. JVM内存区域(运行时数据区)划分

    前言: 我们每天都在编写Java代码,编译,执行.很多人已经知道Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文 ...

随机推荐

  1. C#获取一个文件的扩展名

    C#获取一个文件的扩展名System.IO.Path.GetExtension( "文件名 ");ChangeExtension   更改路径字符串的扩展名. Combine   ...

  2. python判断文件目录是否存在

    import os os.path.isfile('test.txt')  # 如果不存在就返回False os.path.exists(directory)  # 如果目录不存在就返回False o ...

  3. C结构体之位域(位段)

    C结构体之位域(位段) 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C ...

  4. 宏HASH_GET_FIRST

    /*******************************************************************//** Gets the first struct in a ...

  5. HTTPS通信机制

    概述 使用HTTP协议进行通信时,由于传输的是明文所以很容易遭到窃听,就算是加密过的信息也容易在传输中遭受到篡改,因此需要在HTTP协议基础上添加加密处理,认证处理等,有了这些处理机制的HTTP成为H ...

  6. Qt 多线程学习

    最近的项目上用到了关于多线程的知识,自己也比较感兴趣,所以就拿了那本<C++ GUI Qt4 编程>来学习. 这本书的第14章是关于多线程的知识,使用的Qt版本是Qt4.x.在下用的是最新 ...

  7. [转]Jquery Validate用法简介

    原文链接:http://www.cnblogs.com/hejunrex/archive/2011/11/17/2252193.html 正文: 官网地址:http://bassistance.de/ ...

  8. 【转载】ACM总结——dp专辑

    感谢博主——      http://blog.csdn.net/cc_again?viewmode=list       ----------  Accagain  2014年5月15日 动态规划一 ...

  9. C# WinForm中 让控件全屏显示的实现代码

    夏荣全 ( lyout(at)163.com )原文 C#中让控件全屏显示的实现代码(WinForm) 有时候需要让窗口中某一块的内容全屏显示,比如视频播放.地图等等.经过摸索,暂时发现两种可行方法, ...

  10. android Vibrator 使用

    private Vibrator vibrator; 取得震动服务的句柄 vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); 或者 vi ...