-
2021-03-21 21:41:41
程序计数器(Program Counter Rerister)
程序计数器是一块内存较小的区域,它用于存储线程的每个执行指令,每个线程都有自己的程序计数器,此区域不会有内存溢出的情况。
更多相关内容 -
JVM内存区域,开线程影响哪块内存
2019-07-19 22:57:49就为其分配一个Program Counter Register(程序计数器), VM Stack(虚拟机栈)和Native Method Stack (本地方法栈),当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也会被释放掉。...JVM运行时数据区
概括地说来:JVM初始运行的时候都会分配好Method Area(方法区)和Heap(堆),而JVM 每遇到一个线程,就为其分配一个Program Counter Register(程序计数器), VM Stack(虚拟机栈)和Native Method Stack (本地方法栈),当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也会被释放掉。
每当有线程被创建的时候,JVM就需要为其在内存中分配虚拟机栈和本地方法栈来记录调用方法的内容,分配程序计数器记录指令执行的位置,这样的内存消耗就是创建线程的内存代价。
内存作为有限的资源,如果JVM创建了过多的线程,必然会导致资源的耗尽。因此,使用Executor架构复用线程可以节省内存资源,是十分必要的。
JVM的并发是通过线程切换并分配时间片执行来实现的。 在任何一个时刻, 一个处理器内核只会执行一条线程中的指令。因此, 为了线程切换后能恢复到正确的执行位置, JVM需要先保存被挂起线程的上下文环境:将线程执行位置保存到程序计数器中,将调用方法的信息保存在栈中;同时将待执行线程的程序计数器和栈中的信息写入到处理器中,完成线程的上下文切换。维护线程隔离数据区中的内容在处理器中的导入导出,就是线程切换的性能代价。
对象的创建——静态区域加载的多线程安全性为了保证多线程安全性,一些必要的操作都需要加锁来保证其原子性和可见性,但是类中静态区的代码是不需要加锁就能保证多线程安全性。这是因为什么呢?
答案在于JVM类加载过程的保护机制。和普通类的实例被分配在Java堆上不同,类的静态属性都保存在方法区,其创建收到类加载过程的影响。
类的加载过程大题分为:加载(Loading),连接(Linking),初始化(Initialization),使用(Using)和卸载(UnLoading)五个步骤。
这里和静态属性有关的主要是连接和初始化:
在连接步骤的准备阶段,静态属性会分配内存;在初始化步骤,JVM会生成一个特别的方法——<clinit>方法来专门执行静态代码块和静态变量初始化。
<clinit>方法执行的过程中,JVM会对类加锁,保证在多线程环境下,只有一个线程能成功执行<clinit>方法,其他线程都将被拥塞,并且<clinit>方法只能被执行一次,被拥塞的线程被唤醒之后也不会再去执行<clinit>方法。如果类有继承关系,JVM还会保证父类的<clinit>方法将先于子类的<clinit>方法执行。
由此可见,静态代码块的多线程安全性是由JVM为其加锁实现的,这也是延迟初始化占位类模式的安全性基础。
-
被final修饰的变量,存储在内存中的哪块区域?
2020-03-01 16:33:49被final修饰的变量,叫做常量.常量又存在常量池中. ```` public class Student{ static final String school="xx五小"; ... final String grade="三年级";...那么,school,grade,address 分别存储在内存中的哪些位置? -
JS中两个对象相等意味着引用指向同一块内存区域
2018-07-22 15:57:14location1 等于 location2的意思是location1 指向的内存和location2 指向的内存是同一块内存区域。 如果location1 和 location2虽然存储的值相等,但是如果属于不同的内存区域,那么两者仍然不相等。let location1 = {province: '湖北', city: '武汉', country: '武昌'};
let location2 = {province: '湖北', city: '武汉', country: '武昌'};
console.log(location1 === location2);
let location3 = {province: '江苏', city: '南京', country: '中山'};
let location4 = location3;
console.log(location3 === location4);
location1 等于 location2的意思是location1 指向的内存和location2 指向的内存是同一块内存区域。
如果location1 和 location2虽然存储的值相等,但是如果属于不同的内存区域,那么两者仍然不相等。
-
「每日一问」Java虚拟机内存分为哪几个区域?
2020-07-02 10:15:13堆 Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块。它是被所有线程共享的一块内存区域,在虚拟机启动时创建。它就是用来存放对象实例的,几乎所有的对象实例都在这里分配内存。 方法区 方法区(Method ...程序计数器
程序计数器(Program Counter Register)是一块较小的内存空间,它记录了当前线程所执行的字节码的行号。在JVM的概念模型里,字节码解释器工作时就是通过改变它的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都是依赖它来完成的。
虚拟机栈
与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,每一个线程都有自己的虚拟机栈,它的生命周期与线程相同,当线程被创建时,虚拟机栈也同时被创建;当线程被销毁时,虚拟机栈也同时被销毁。
本地方法栈
本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。
堆
Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块。它是被所有线程共享的一块内存区域,在虚拟机启动时创建。它就是用来存放对象实例的,几乎所有的对象实例都在这里分配内存。
方法区
方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
参考答案
程序计数器、虚拟机栈、本地方法栈、堆、方法区
文章持续更新,微信搜索「 万猫学社 」第一时间阅读。
-
理解Java中的静态域、代码块和内存区域图
2018-07-23 21:04:50静态域会随着类的加载而加载并初始化,存在于方法区内存中的字节码文件的静态区域中。 优先于对象存在,先有方法区的类加载,后才可能会有堆内存的对象实例化。 静态域会被所有的对象共享,也称为共享区。 一般共... -
内存区域的划分和分配
2018-09-23 16:31:412、堆区(heap) — 在内存开辟另一块存储区域。一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。用mall... -
类的成员变量存在JVM的哪块内存区域
2019-02-25 13:32:35使用synchronized关键字,在同步方法/同步块开始时(Monitor Enter),使用共享变量时会从主内存中刷新变量值到工作内存中(即从主内存中读取最新值到线程私有的工作内存中),在同步方法/同步块结束时(Monitor ... -
类的实例对象在内存中存储分为哪三块区域?
2018-02-06 22:04:42对于HotSpot虚拟机来说,Java类的实例对象在内存中存储分为三块区域,分别是对象头、实例数据、对齐填充。 对象头 对象头包含两部分,第一部分用于存储对象自身运行时的数据,包括GC分代年龄、哈希码、锁状态、... -
深入理解Java虚拟机-Java内存区域与内存溢出异常
2020-01-03 21:42:24Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来。 文章目录概述运行时数据区域程序计数器(线程私有)Java虚拟机栈(线程私有)局部变量表操作数栈动态链接... -
C/C++中程序内存区域划分大总结
2016-03-28 19:24:05程序由代码和数据组成,其中代码存储在代码区中,数据根据类型的不同存储在不同的区域中。本文分别介绍了C和C++中内存区域的划分。 C++作为一款C语言的升级版本,具有非常强大的功能。它不但能够支持各种程序设计... -
Java内存区域划分
2018-10-07 13:11:14是一块较小的内存空间,可以看作当前线程所执行的字节码的行号指示器。 java多线程就是通过对线程的轮流切换并分配处理器的执行时间的方式来实现的,在任意时刻,一个处理器都只会执行某一个线程中的指令。所以每条... -
Java内存区域JVM
2019-06-01 17:32:44Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区 域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而 存在,有些区域则依赖用户线程的启动和结束而... -
内存区域的划分
2017-08-12 16:38:48本文主要讲解应用层(c/c++内存划分)、linux内核层(X86体系和ARM系统)关于内存上面的划分相关知识点。 一、应用层 1. 在c中分为这几个存储区:堆、栈、全局区(静态区)、常量区 (1).栈 - 由编译器自动分配... -
Java 虚拟机内存区域划分详解(1)
2015-04-14 17:02:20而对于 Java 程序员来说,在虚拟机的自动内存管理机制的帮助下,不再需要为每一个 new 操作去写配对的 delete/free 代码,而且不容易出现内存泄漏和内存溢出问题,看起来由虚拟机管理内存一切都很美好。不过,也正是... -
jvm内存溢出区域和排查方法
2019-01-17 13:50:09内存泄漏:即声明的对象无法被回收,一直存在于内存中,使得占用的内存就像被泄漏消失了一样 内存溢出:即剩余可用的内存空间过小,无法分配出下一步工作需要的内存。 内存泄漏过多必然会导致内存溢出 内存溢出... -
说一说 JVM 内存区域划分,哪些区域可能发生 OOM
2018-09-15 21:16:39通常情况下,我们可以把 JVM 的内存区域划分为以下几个部分,其中,有的区域是以线程作为单位,而有的区域则是整个 JVM 进程唯一的:1.程序计数器在 JVM 规范中,每... -
Linux内存描述之内存区域zone--Linux内存管理(三)
2016-08-31 14:11:07日期 内核版本 架构 作者 GitHub CSDN 2016-08-31 ... Linux内存管理 1 前景回顾前面我们讲到服务器体系(SMP, NUMA, MPP)与共享存储器架构(UMA和NUMA)1.1 UMA和NUMA两种模型共享存储型多处理机有两种模型 -
jvm(三)--java内存区域之线程共享区
2019-01-10 15:35:16本笔记作为jvm学习系列的第三篇,上一篇讲完了java内存区域中的线程独占区,这一篇来讲线程共享区的内容,也即堆与方法区,但是堆的内容有意思的东西实在太多了,像对象的创建,gc的回收算法,本地线程分配缓冲... -
JVM-02内存区域与内存溢出异常(中)【hotspot虚拟机对象】
2018-07-27 19:20:58思维导图 对象的创建 对象的内存布局 对象头( Header ) ...在 JVM-01自动内存管理机制之Java内存区域与内存溢出异常(上)中我们介绍了 运行时数据区域,这里我们来继续探讨下hotspot虚拟机对象 ... -
java内存区域
2019-12-16 12:22:14对于java开发人员来说,在虚拟机自动内存管理的机制下,不需要为每一个new操作去写配对的delete/free代码,不容易出现内存泄漏和溢出的问题,不过也正是这有,把内存控制的权利交给了虚拟机,一旦出现内存泄漏和溢出方面的... -
内存管理:程序是如何被优雅的装载到内存中的
2021-11-04 09:26:35内存作为计算机中一项比较重要的资源,它的主要作用就是解决CPU和磁盘之间速度的鸿沟,但是由于内存条是需要插入到主板上的,因此对于一台计算机来说,由于物理限制,它的内存不可能无限大的。我们知道我们写的代码... -
【微机原理】实验四 内存块移动实验
2019-09-21 17:57:55程序要求把内存中一数据区(称为源数据块)传送到内存另一数据区(称为目的数据块)。源数据块和目的数据块在存贮中可能有三种情况,如下图所示。 对于两个数据块分离的情况,如图(a),数据的传送从据块... -
JVM学习(一)Java内存区域与内存溢出异常
2021-04-07 14:27:35Java内存区域与内存溢出异常 文章目录Java内存区域与内存溢出异常????运行时数据区域程序计数器Java虚拟机栈本地...Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的 -
Java内存区域与内存溢出
2020-02-09 17:27:55内容参考《深入理解JVM虚拟机》,本文JVM均指HotSpot虚拟机。 Java与C语言针对“内存管理”...而在Java中,内存由JVM管理,垃圾回收器GC会帮助开发者自动回收不再被引用的对象来释放内存,使得Java不太会像C语言那... -
Java内存区域
2019-10-30 20:42:05对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像 C/C++程序开发程序员这样为每一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序员把内存控制权利... -
Java虚拟机(JVM)运行时内存区域划分详解
2017-04-14 11:13:49最近一直没有怎么更新自己的博客,主要是由于老哥公司最近的一个招标项目忙得焦头烂额,心力憔悴(ಥ_ಥ),趁着项目的空档期来重构一下以前的一篇关于jvm内存区域划分的博客,仔细阅读了一下之前的博客,大量的文字... -
Java - null在内存中到底是什么
2018-09-26 16:44:11Java中随时都在使用 null,那么 null 到底是什么?让我们从一个简单的表达式说起: String x = null; 1. 这句话的确切含义是什么? 回想什么是变量,什么是值。一个常见的隐喻是一个变量类似于一个盒子。就像你... -
Android 性能优化 之谈谈Java内存区域
2018-03-28 14:10:59最近一年副业主要在学习投资和技能学习,把以前学习内存分析的一些笔记总结发出来,写了很多笔记总结都没有写完就又忙着了,最近再次总结复习学习一遍,还有提醒各位同学一定要学会投资。。 了解Android 内存管理... -
JVM五大内存区域介绍
2019-07-11 11:40:21程序计数器是一块很小的内存空间,它是线程私有的,可以认作为当前线程的行号指示器。 那么计数器记录虚拟机字节码指令的地址。如果为native【底层方法】,那么计数器为空。 这块内存区域是虚拟机规范中唯一没有...