程序计数器

Java 程序计数器

吃可爱长大的小学妹 提交于 2019-12-22 10:47:34
Java 程序计数器 1. 概述 程序计数器是一块较小的内存空间,它的作用可以看做是 当前线程 所执行的 字节码 的 行号指示器 。 在概念模型中, 字节码解释器 工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要这个计数器来完成 Java 虚拟机的 多线程 是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多喝处理器来说是一个内核)只会执行一条线程中的指令。 因此,为了线程切换后能恢复到正确的执行位置,每个线程都需要有 一个独立的程序计数器 ,各条线程之间的计数器互不影响,独立存储,称这类内存区域为**“线程私有”**的内存。 如果线程现在正在执行的是一个 Java 方法 ,这个计数器记录的是正在执行的虚拟机 字节码指令的地址 如果线程正在执行的是 Native 方法 ,这个计数器值则为 空(Undefined) (Native方法是非Java语言编写,比如c/c++,它们无法在 Java 编译时生成字节码,即JVM 获取不到 native 实现, 只能通过系统指令去调用native方法) 此内存区域是唯一一个在 Java 虚拟机规范中 没有规定任何 OutOfMemoryError 情况的区域 2.特点 占内存很小,唯一不会规定任何 OutOfMemoryError情况

Java内存区域

旧巷老猫 提交于 2019-12-16 02:25:40
根据Java虚拟机规范,Java虚拟机会把Java的所管理的内存分成几个区域,分别为:程序计数器,Java虚拟机栈,本地方法栈,堆,方法区 通过一张图来了解一下: 先要说明的一点是,java虚拟机栈,本地方法栈和程序计数器是线程私有的,方法区,堆是线程共享的,接下来逐一介绍 程序计数器 程序计数器是一块较小的内存空间 可以把程序计数器理解为方法执行的行号指标,字节码解释器可以通过改变这个计数器的值来选取下一条需要执行的字节码指令。实现分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖这个计数器来完成。 程序计数器是线程私有的,为什么是线程私有的?即使Java中的多线程,高并发,他们只是在宏观上实现并发,但不是并行。所以多个线程时通过切换来分配cpu的时间片,任何一个时刻,一个处理器都只会执行一条线程中的指令,需要程序计数器来保证切换后线程能恢复到正确的执行位置,这样就能理解程序计数器为什么是线程私有的。 如果线程执行的是普通方法,那么程序计数器记录的是正在执行的虚拟机字节码指令的地址;如果线程执行的是native方法,那么程序计数器为空。 该区域没有规定任何OutOfMemoryError 虚拟机栈 虚拟机栈也是线程私有的 虚拟机栈描述的是Java方法的内存模型,每个方法在执行的同时都会创建一个 栈帧 ,在栈帧中有局部变量表,操作数栈,动态链接,方法接口等信息

Java内存管理-JVM内存模型以及JDK7和JDK8内存模型对比总结(三)

随声附和 提交于 2019-12-14 17:37:47
转载:https://www.jianshu.com/p/5b3717ff06ce 知识地图: 一、概述 Java的内存管理采用[自动内存管理]机制,因为这个自动管理机制,Java程序员就不需要去写释放内存的代码,而且不容易出现内存泄漏问题(比C/C++程序员少一些烦恼)。但是由于内存的申请和释放都交给了Java虚拟机,一旦出现内存泄漏和溢出问题时,在不了解Java虚拟机内存结构和自动管理机制的情况下,就很难排查问题的所在。所以如果想要成为一个优秀的程序员或者进阶为一个牛逼的架构师,掌握Java虚拟机的自动内存管理机制那是必须的。 二、JVM运行时数据区域 根据《Java虚拟机规范(Java SE 7版)》的规定,Java虚拟机所管理的内存将会包括以下几个运行时的数据区域:程序计数器(Program Counter Register)、Java栈(VM Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap)。 如图所示: 注:上图的虚拟机运行时数据区是Java虚拟机规范所规定的区域,不同的虚拟机有不同的实现。 上面图片有线程共享和线程隔离的区域,下面在通过一张图片来进行简单说明,让你更加清晰的理解什么是线程共享和什么是线程隔离。 通过上面的两个图,大概对JVM的内存模型有个初步的认识

JVM的内存区域划分(jdk7和jdk8)

丶灬走出姿态 提交于 2019-12-13 19:59:15
前言 1、什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 2、JRE/JDK/JVM是什么关系 JRE(JavaRuntimeEnvironment,Java运行环境),也就是Java平台。所有的Java 程序都要在JRE下才能运行。普通用户只需要运行已开发好的java程序,安装JRE即可。 JDK(Java Development Kit)是程序开发者用来来编译、调试java程序用的开发工具包。JDK的工具也是Java程序,也需要JRE才能运行。为了保持JDK的独立性和完整性,在JDK的安装过程中,JRE也是 安装的一部分。所以,在JDK的安装目录下有一个名为jre的目录,用于存放JRE文件。 JVM(JavaVirtualMachine,Java虚拟机)是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。 3、JVM执行程序的过程

CPU

不问归期 提交于 2019-12-12 10:36:07
CPU 1. CPU是什么? 2.CPU 实际做什么? 3.CPU 的内部结构 4.CPU 是寄存器的集合体 5.计算机语言 6.汇编语言 7.程序计数器 8.条件分支和循环机制 9.标志寄存器 10.函数调用机制 11.通过地址和索引实现数组 12.CPU 指令执行过程 13.总结 1. CPU是什么? CPU 的全称是 Central Processing Unit ,它是你的电脑中最硬核的组件,这种说法一点不为过。CPU 是能够让你的计算机叫计算机的核心组件,但是它却不能代表你的电脑,CPU 与计算机的关系就相当于大脑和人的关系。 它 是一种小型的计算机芯片 ,它嵌入在台式机、笔记本电脑或者平板电脑的主板上。通过在单个计算机芯片上放置数十亿个微型晶体管来构建 CPU。 这些晶体管使它能够执行运行存储在系统内存中的程序所需的计算,也就是说 CPU 决定了你电脑的计算能力。 2.CPU 实际做什么? CPU 的核心是从程序或应用程序获取指令并执行计算。 此过程可以分为三个关键阶段: 提取,解码和执行 。 CPU从系统的 RAM 中提取指令,然后解码该指令的实际内容,然后再由 CPU 的相关部分执行该指令。 RAM : 随机存取存储器 (英语:Random Access Memory,缩写:RAM),也叫主存,是与 CPU 直接交换数据的内部存储器。它可以 随时读写 (刷新时除外)

JVM内存模型——程序计数器

烈酒焚心 提交于 2019-12-10 17:11:00
程序计数器又称为PC寄存器,是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器(实际是指令的偏移地址。在CPU中PC寄存器存放的是下一条指令地址,在JVM中存放的是正在执行的指令地址)。程序中的分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器完成。由于多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,故该区域为线程私有的内存。当执行的是JVM的方法时,则寄存器中保存的是当前执行指令的地址;执行的是native方法,则寄存器中为空。也是唯一一块不存在溢出的区域。 特点总结: 线程私有; 生命周期随线程; 唯一没有OutOfMemoryError异常的区域。 特点分析: 程序计数器用于记录线程执行的位置,所以是每个线程私有的。由于线程在创建后运行中随时可能由于时间片耗尽而进行切换,所以程序计数器的生命周期是随线程创建而创建,随线程销毁而销毁的。程序计数器记录了线程执行的偏移量,在线程运行期间只是改变偏移量的值,不需要申请新的内存空间,所以不会出现内存溢出。 参考: https://www.jianshu.com/p/77c882f47b29 来源: CSDN 作者: saishangmingzhu 链接: https://blog.csdn.net/saishangmingzhu/article/details/102975379

JVM(2) JVM内存模型

丶灬走出姿态 提交于 2019-12-09 11:50:23
一、概述 Java的内存管理采用[自动内存管理]机制,因为这个自动管理机制,Java程序员就不需要去写释放内存的代码,而且不容易出现内存泄漏问题(比C/C++程序员少一些烦恼)。但是由于内存的申请和释放都交给了Java虚拟机,一旦出现内存泄漏和溢出问题时,在不了解Java虚拟机内存结构和自动管理机制的情况下,就很难排查问题的所在。所以如果想要成为一个优秀的程序员或者进阶为一个牛逼的架构师,掌握Java虚拟机的自动内存管理机制那是必须的。 二、JVM运行时数据区域 根据《Java虚拟机规范(Java SE 7版)》的规定,Java虚拟机所管理的内存将会包括以下几个运行时的数据区域:程序计数器(Program Counter Register)、Java栈(VM Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap)。 如图所示: 注:上图的虚拟机运行时数据区是Java虚拟机规范所规定的区域,不同的虚拟机有不同的实现。 上面图片有线程共享和线程隔离的区域,下面在通过一张图片来进行简单说明,让你更加清晰的理解什么是线程共享和什么是线程隔离 通过上面的两个图,大概对JVM的内存模型有个初步的认识,下面我们在看一下具体的每一个区域到底是什么东东。 1 、程序计数器 程序计数器(Program Counter Register

.NET连接池的问题详解

空扰寡人 提交于 2019-12-07 22:09:25
来自森大科技官方博客 http://www.cnsendblog.com/index.php/?p=135 GPS平台、网站建设、软件开发、系统运维,找森大网络科技! http://cnsendnet.taobao.com NET 连接池救生员 NET 连接池救生员 防止可淹没应用程序的池溢出 William Vaughn 大多数 ADO.NET 数据提供程序使用连接池,以提高围绕 Microsoft 断开连接的 .NET 结构构建的应用程序的性能。应用程序首先打开一个连接(或从连接池获得一个连接句柄),接着运行一个或多个查询,然后处理行集,最后将连接释放回连接池。如果没有连接池,这些应用程序将花费许多额外时间来打开和关闭连接。 当您使用 ADO.NET 连接池来管理基于 Web 的应用程序和客户端/服务器 Web 服务应用程序的连接时,您的客户通常会获得更快的连接和更好的总体性能。但是,当您的应用程序或 Web 站点上突然涌入了同时希望进行连接的大量客户时,会发生什么事情呢?您的应用程序会“沉没”,还是会“游泳”?就像救生员一样,您需要仔细监视连接池,以维护它的良好性能,并防止连接池发生溢出。我们首先探讨连接池可能溢出的原因,然后讨论如何编写代码或使用 Windows 性能监视器来监视连接池。 正如我于 2003 年 5 月发表的 “Swimming in the .NET

5.3.6 程序计数器

谁说我不能喝 提交于 2019-12-06 10:55:39
对于一个运行中的Java程序而言,其中的每一个线程都有它自己的PC (程序计数器)寄存 器,它是在该线程启动时创建的。PC寄存器的大小是一个字长,因此它既能够持有一个本地指 针,也能够持有一个returnAddress。当线程执行某个Java方法时,PC寄存器的内容总是下一条 将被执行指令的“地址“,这里的“地址”可以是一个本地指针,也可以是在方法字节码中相对 于该方法起始指令的偏移量。如果该线稈正在执行一个本地方法,那么此时PC寄存器的值是 “undefined”。 来源: https://www.cnblogs.com/mongotea/p/11979462.html

.NET连接池的问题详解

别等时光非礼了梦想. 提交于 2019-12-06 10:36:27
来自森大科技官方博客 http://www.cnsendblog.com/index.php/?p=135 GPS平台、网站建设、软件开发、系统运维,找森大网络科技! http://cnsendnet.taobao.com NET 连接池救生员 NET 连接池救生员 防止可淹没应用程序的池溢出 William Vaughn 大多数 ADO.NET 数据提供程序使用连接池,以提高围绕 Microsoft 断开连接的 .NET 结构构建的应用程序的性能。应用程序首先打开一个连接(或从连接池获得一个连接句柄),接着运行一个或多个查询,然后处理行集,最后将连接释放回连接池。如果没有连接池,这些应用程序将花费许多额外时间来打开和关闭连接。 当您使用 ADO.NET 连接池来管理基于 Web 的应用程序和客户端/服务器 Web 服务应用程序的连接时,您的客户通常会获得更快的连接和更好的总体性能。但是,当您的应用程序或 Web 站点上突然涌入了同时希望进行连接的大量客户时,会发生什么事情呢?您的应用程序会“沉没”,还是会“游泳”?就像救生员一样,您需要仔细监视连接池,以维护它的良好性能,并防止连接池发生溢出。我们首先探讨连接池可能溢出的原因,然后讨论如何编写代码或使用 Windows 性能监视器来监视连接池。 正如我于 2003 年 5 月发表的 “Swimming in the .NET