Java性能优化之JVM内存模型

news/2024/7/20 13:40:21 标签: java, runtime, 内存管理

JVM内存模型

首先介绍下Java程序具体执行的过程:

  • Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀);
  • 由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行
  • 在整个程序执行过程中,JVM会用==一段空间==来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为==Runtime Data Area(运行时数据区)==,也就是我们常说的JVM内存;
  • 因此,在Java中我们常常说到的内存管理就是针对这段空间进行管理(如何分配和回收内存空间)

JVM的内存划分和各区域职责

  • 程序计数器:程序计数器是指CPU中的寄存器,它保存的是==程序当前执行的指令的地址==(也可以说保存下一条指令的所在存储单元的地址),当CPU需要执行指令时,需要从程序计数器中得到当前需要执行的指令所在存储单元的地址,然后根据得到的地址获取到指令,在得到指令之后,程序计数器便自动加1或者根据转移指针得到下一条指令的地址,如此循环,直至执行完所有的指令;

    注:JVM中的程序计数器并不像汇编语言中的程序计数器一样是物理概念上的CPU寄存器,但是逻辑作用上是等同的,在JVM中多线程是通过线程轮流切换来获得CPU执行时间的,在任一具体时刻,一个CPU的内核只会执行一条线程中的指令,为了能够使得每个线程都在线程切换后能够恢复在切换之前的程序执行位置,每个线程都需要有自己独立的程序计数器,并且不能互相被干扰,否则就会影响到程序的正常执行次序。==因此,可以这么说,程序计数器是每个线程所私有的==
  • Java栈:Java栈是Java方法执行的内存模型,Java栈中存放的是一个个的栈帧,每个栈帧(包括:局部变量表、操作数栈、运行时常量池(在下文中提到的方法区内)的引用、方法返回地址和一些额外的附加信息)对应一个被调用的方法,当线程执行一个方法时,就会随之创建一个对应的栈帧,并将建立的栈帧压栈。当方法执行完毕之后,便会将栈帧出栈;

    注:由于每个线程正在执行的方法可能不同,因此每个线程都会有一个自己的Java栈,互不干扰
  • 本地方法栈:Java栈是为执行Java方法服务的,而本地方法栈则是为执行本地方法(Native Method)服务的;
  • :Java中的堆是用来存储对象本身的以及数组;
  • 方法区:它与堆一样,是被线程共享的区域,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。

    注:在方法区中有一个非常重要的部分就是运行时常量池,它是每一个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后,对应的运行时常量池就被创建出来。当然并非Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中,比如String的intern方法。

转载于:https://www.cnblogs.com/zx68/p/10032380.html


http://www.niftyadmin.cn/n/1471595.html

相关文章

(第三场) H Diff-prime Pairs 【数论-素数线性筛法+YY】

题目链接 题目描述 Eddy has solved lots of problem involving calculating the number of coprime pairs within some range. This problem can be solved with inclusion-exclusion method. Eddy has implemented it lots of times. Someday, when he encounters another c…

软件测试_Loadrunner_APP测试_性能测试_脚本录制_基本操作流程

这次主要是写一下使用Loadrunner对APP进行性能测试的基本流程,有关性能测试监控指标请查看链接:软件测试_性能测试_关注点。 先决条件:已安装Loadrunner。如未安装,请查看链接:软件测试_测试工具_Loadrunner&#xff0…

java 远程接口_java中如何正确的使用远程接口

服务器必须包含一个扩展了UnicastRemoteObject的类,并实现远程接口。这个类也可以含有附加的方法,但客户只能使用远程接口中的方法。这是显然的,因为客户得到的只是指向接口的一个句柄,而非实现它的那个类。必须为远程对象明确定义…

numpy函数:[1]shape用法

shape函数是numpy.core.fromnumeric中的函数,它的功能是读取矩阵的长度,比如shape[0]就是读取矩阵第一维度的长度。它的输入参数可以使一个整数表示维度,也可以是一个矩阵。转载于:https://www.cnblogs.com/students/p/9381342.html

JavaScript 的 this 原理

一、问题的由来 学懂 JavaScript 语言,一个标志就是理解下面两种写法,可能有不一样的结果。 var obj {foo: function () {} }; var foo obj.foo; // 写法一 obj.foo() // 写法二 foo() 上面代码中,虽然obj.foo和foo指向同一个函数&#…

python读取mat数据是字典形式如何转化为矩阵_python读取mat文件,并转化为txt文件...

核心为scipy.io中的loadmat包。from scipy.io import loadmatimport numpy as npm loadmat(E:\\biye\\Rochester38.mat)print(m.keys())具体的看一看,文件中的key有哪些。以我的文档为例dict_keys([__header__, __version__, __globals__, A, local_info])其中前三…

GPIO实现I2C协议模拟(2)

接着上一节继续补充 结合上一节的描述 写Slave的过程如下(BYTE) 读Slave的过程如下(BYTE) 分为两段 第一段 ,写OFFSET,第二段读数据 WORD的方式与BYTE大同异 读行为 读到一个BYTE就需要发一次ACK,最后一次不发ACK,而是发NACK 写行为 后面 Sla…

python opencv3 使用numpy访问图像数据

1 # coding:utf82 import cv23 4 """5 将bgr在(0, 0)处改为白色像素6 7 0号为green 1号为blue 2号为red8 img的每一个位置存一个 3个长度的向量 分别表示gbr9 """ 10 # img cv2.imread("../data/mm2.jpeg") 11 # print(img[0, 0]) …