最近在看《深入理解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(运行时数据区)
Jvm基础(1)-Java运行时数据区的更多相关文章
-
JVM 专题十:运行时数据区(五)堆
1. 核心概述 1.1 堆概述 一个进程对应一个jvm实例,一个运行时数据区,又包含多个线程,这些线程共享了方法区和堆,每个线程包含了程序计数器.本地方法栈和虚拟机栈. 一个jvm实例只存在一个堆内存 ...
-
【JVM第三篇--运行时数据区】程序计数器、虚拟机栈、本地方法栈
写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.运行时数据区 我们在编写Java程序时,使用JVM的流程主要如下所示: 虚拟机在 ...
-
读书笔记-浅析Java运行时数据区
作为一个 Java 为主语言的程序员,我偶尔也需要 用 C/C++ 写程序,在使用时让我很烦恼的一件事情就是需要对 new 出来的对象进行 delete/free 操作,我老是担心忘了这件事情,从而导 ...
-
JVM系列之四:运行时数据区
1. JVM架构图 Java虚拟机主要分为五大模块:类装载器子系统.运行时数据区.执行引擎.本地方法接口和垃圾收集模块. 2. JDK1.7内存模型-运行时数据区域 根据<Java 虚拟机规范( ...
-
【JVM第四篇--运行时数据区】堆
写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.堆的概述 JVM的运行时数据区如下: 一个Java程序运行起来对应着一个进程(操 ...
-
Java 运行时数据区和内存模型
运行时数据区是指对 JVM 运行过程中涉及到的内存根据功能.目的进行的划分,而内存模型可以理解为对内存进行存取操作的过程定义.总是有人望文生义的将前者描述为 "Java 内存模型" ...
-
Java运行时数据区
目录 1. 概述 2. Java内存结构 3. 程序计数器 4. Java虚拟机栈 5. 本地方法栈 6. 堆 7. 方法区 8. 运行时常量池 9. 直接内存 10. 总结 1. 概述 作为日常的J ...
-
【转】Java运行时数据区简介及堆与栈的区别
理解JVM运行时的数据区是Java编程中的进阶部分.我们在开发中都遇到过一个很头疼的问题就是OutOfMemoryError(内存溢出错误),但是如果我们了解JVM的内部实现和其运行时的数据区的工作机 ...
-
JVM内存区域(运行时数据区)划分
前言: 我们每天都在编写Java代码,编译,执行.很多人已经知道Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文 ...
随机推荐
-
移动web开发之视口viewport
× 目录 [1]布局视口 [2]视觉视口 [3]理想视口[4]meta标签[5]总结 前面的话 在CSS标准文档中,视口viewport被称为初始包含块.这个初始包含块是所有CSS百分比宽度推算的根源 ...
-
ASP.NET MVC部分视图PartialView的使用
在ASP.NET MVC项目中,部分视图PartialVieww使用很广.它实际就是在ASP.NET环境的用户自定义控件UserControl. 在控制器中,创建一个视图操作Action和一个部分视图 ...
-
Redis常见用法
using ServiceStack.Redis;using System;using System.Collections.Generic;using System.Linq;using Syste ...
-
ORM原型概念
ORM[Object-Relation-Mapping]对象关系映射. 这个名词已经出来好几年了.已经不陌生. 以前在项目中针对相对复杂业务逻辑时一般采用领域模型驱动方式进行业务概述,分析和建模. ...
-
写给自己看的Linux运维基础(二) - Apache/MySQL. 安全设置. 定时任务
本文使用环境为CentOS 6 Apache, PHP, MySQL等常用软件均可通过yum安装包获取 yum install httpd php mysql-server # mysql: 客户端; ...
-
如何解决adb devices 端口被占用的问题zz
在win xp ,win 7 上使用adb时, 越来越多的人出现了 adb devices 命令长时间无响应.adb start-server 失败.eclipse adt初始化时卡在dbms-ini ...
-
返回hash 类型的json
else{ $hash{$phone}="没有找到需要的验证码信息"; $c->render(json => \%hash );
-
DeeplabV3+ 在自己环境下跑出现的错误
1. no module named 'deeplab' 解决办法:把 models/research 和 models/research/slim 加到环境变量path中不管用,需要在 cmd 中运 ...
-
MySQL动态开启general_log
mysql下用以下命令查看general_log的开启状态. show global variables like '%general%'; 调整general_log位置,linux下一般是/tmp ...
-
VS2012快捷键突然不能用怎么办
晚上做项目做着做着,就去弄了下键盘配置,可怜的娃娃~~~一下子弄得什么快捷键都不能用了,比如”注释:ctrl+k ctrl+c”;问题纠结了我一个多钟,好在最后结合了网络上各路英雄的idea;解决了问 ...