当前位置:网站首页>jvm-运行时数据区
jvm-运行时数据区
2022-07-03 13:28:00 【名字忒不好取】
以下的分区都是逻辑分区;
类加载器将class静态数据结构加载进lvm中,运行时数据区就是存储这些数据的;
jvm类似于冯诺依曼计算机模型:
1、输入设备:类加载器,将class文件加载进jvm
2、存储器:运行时数据区
3、输出设备:jvm输出给底层操作系统的二进制指令
4、中央处理器:(运算器、控制器):
jvm中又类似于cpu与内存的交互:
1、主内存:
类比方法区和堆:线程共享的
2、cpu中的高速缓冲区:
线程私有的java虚拟机栈、本地方法栈、程序计数器
方法区
方法区其实是一种规范,不同的java虚拟机需要自己去实现
jdk1.8之前的实现:永久代(PermGen)
jdk1.8及之后:元空间(PermGen)
方法区中到底存储的有哪些数据?
1、字符串常量池(jdk1.6之前存储在永久代,1.8及以后实际存储在堆当中)
2、静态变量(元空间中存储在堆中)
3、类信息:(元空间存储在直接内存)
版本号、字段、方法、接口、父类等描述信息
4、即时编译过后的代码(如final修饰的)
5、运行时常量池
方法区是线程共享的
静态常量池
静态常量池是相对于运行时常量池来说的,属于描述class文件结构的一部分,由字面量和符号引用组成,在类被加载后会将静态常量池加载到内存中也就是运行时常量池
字面量:文本,字符串以及Final修饰的内容
符号引用:类,接口,方法,字段等相关的描述信息
运行时常量池
类,接口,方法,字段等相关的描述信息,也就是真正的把文件的内容落地到JVM内存了
字符串量池
字符串作为最常用的数据类型,为减小内存的开销,专门为其开辟了一块内存区域(字符串常量池)用以存放;
JDK1.6及之前版本,字符串常量池是位于永久代(相当于现在的方法区)。
JDK1.8及之后,字符串常量池位于Heap堆中
常见问题:String a ="aaaa";最多产生一个字符串对象
首先“aaaa”会被认为字面量,先在字符串常量池中查找(.equals()),如果没有找到,在堆中创建“aaaa”
字符串对象,并且将“aaaa”的引用维护到字符串常量池中(实际是一个hashTable结构,存放key-value
结构数据),再返回该引用;如果在字符串常量池中已经存在“aaaa”的引用,直接返回该引用。
String a =new String("aaaa");最多创建两个对象
首先“aaaa”会被认为字面量,先在字符串常量池中查找(.equals()),如果没有找到,在堆中创建“aaaa”
字符串对象,然后再在堆中创建一个“aaaa”对象,返回后面“aaaa”的引用
intern()
String s1 = new String("xxx");
String s2 = s1.intern();
System.out.println(s1 == s2); //false
String中的intern方法是一个 native 的方法,当调用 intern方法时,如果常量池已经包含一个等于此String
对象的字符串(用equals(object)方法确定),则返回池中的字符串。否则,将intern返回的引用指向当前
字符串 s1(jdk1.6版本需要将s1 复制到字符串常量池里)
堆
堆是线程共享的
堆中存储什么?
1、对象实例和数组
2、类加载后创建的对应类的java.lang.Class对象
java虚拟机栈
线程私有的
1、虚拟机栈是一个线程执行的区域,保存着一个线程中方法的调用状态。换句话说,一个Java线程的运行状
态,由一个虚拟机栈来保存,所以虚拟机栈肯定是线程私有的,独有的,随着线程的创建而创建
2、每一个被线程执行的方法,为该栈中的栈帧,即每个方法对应一个栈帧。调用一个方法,就会向栈中压入
一个栈帧;一个方法调用完成,就会把该栈帧从栈中弹出
例如方法调用:
void a(){
b();
}
void b(){
c();
}
void c(){
}
栈帧
线程私有
1、每个栈帧对应一个被调用的方法,可以理解为一个方法的运行空间
2、每个栈帧中包括局部变量表(Local Variables)、操作数栈(Operand Stack)、指向运行时常量池的引用
(A reference to the run-time constant pool)、方法返回地址(Return Address)和附加信息
1、局部变量表:方法中定义的局部变量以及方法的参数存放在这张表中
局部变量表中的变量不可直接使用,如需要使用的话,必须通过相关指令将其加载至操作数栈中作为操作数
使用。
2、操作数栈:以压栈和出栈的方式存储操作数的
3、动态链接:每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法
调用过程中的动态连接(Dynamic Linking)。
4、方法返回地址:当一个方法开始执行后,只有两种方式可以退出,一种是遇到方法返回的字节码指令;一种是
遇见异常,并且这个异常没有在方法体内得到处理。
程序计数器
线程私有的
我们都知道一个JVM进程中有多个线程在执行,而线程中的内容是否能够拥有执行权,是根据CPU调度来的
假如线程A正在执行到某个地方,突然失去了CPU的执行权,切换到线程B了,然后当线程A再获得CPU执行权
的时候,怎么能继续执行呢?这就是需要在线程中维护一个变量,记录线程执行到的位置。
如果线程正在执行Java方法,则计数器记录的是正在执行的虚拟机字节码指令的地址;
如果正在执行的是Native方法,则这个计数器为空。
本地方法栈
线程私有的
1、如果当前线程执行的方法是Native类型的,这些方法就会在本地方法栈中执行。
2、那如果在Java方法执行的时候调用native的方法呢?
在栈帧中通过动态链接关联
1、栈指向堆
在方法中 A a=new A(),局部变量引用指向堆对象(其实可能会存在逃逸行为,如果这个对象的使用
范围只是在方法中,那么对象就不会存在堆中,方便GC);
2、方法区指向堆
静态变量引用指向堆中对象
3、堆指向方法区
一个对象怎么知道它是由哪个类创建出来的?堆中的对象存储时会存一些额外信息:比如class point 指向
方法区中存储的类信息;还会存储mark word(存储锁标识、gc时的年龄)、示例数据(就是实例变量)、(如果是数组还会额外存储数组长度)、对齐填充
边栏推荐
- Bidirectional linked list (we only need to pay attention to insert and delete functions)
- [技术发展-24]:现有物联网通信技术特点
- ThreadPoolExecutor realizes multi-threaded concurrency and obtains the return value (elegant and concise way)
- logback日志的整理
- Resource Cost Optimization Practice of R & D team
- pytorch 载入历史模型时更换gpu卡号,map_location设置
- RocksDB LRUCache
- 信创产业现状、分析与预测
- Uniapp skills - scrolling components -1
- Go 1.16.4: purpose of go mod tidy
猜你喜欢
Go language web development series 26: Gin framework: demonstrates the execution sequence of code when there are multiple middleware
[机缘参悟-37]:人感官系统的结构决定了人类是以自我为中心
[bw16 application] instructions for firmware burning of Anxin Ke bw16 module and development board update
PhpMyAdmin stage file contains analysis traceability
Dlopen() implements dynamic loading of third-party libraries
Go language web development series 28: solve cross domain access of CORS with gin contrib / CORS
Go language unit test 3: go language uses gocovey library to do unit test
核酸修饰的金属有机框架药物载体|PCN-223金属有机骨架包载Ad金刚烷|ZIF-8包裹阿霉素(DOX)
MySQL data processing value addition, deletion and modification
Implementation of Muduo accept connection, disconnection and sending data
随机推荐
[quantitative trading] permanent portfolio, turtle trading rules reading, back testing and discussion
C language standard IO function sorting
[how to earn a million passive income]
[机缘参悟-37]:人感官系统的结构决定了人类是以自我为中心
Leetcode-1175. Prime Arrangements
Go language web development series 27: Gin framework: using gin swagger to implement interface documents
Go 1.16.4: purpose of go mod tidy
Dlopen() implements dynamic loading of third-party libraries
Disruptor -- a high concurrency and high performance queue framework for processing tens of millions of levels
解决MySql 1045 Access denied for user ‘root‘@‘localhost‘ (using password: YES)
金属有机骨架MIL-88负载阿霉素DOX|叶酸修饰UiO-66-NH2负载阿霉素[email protected]纳米粒子
Libuv Library - Design Overview (Chinese version)
叶酸修饰的金属-有机骨架(ZIF-8)载黄芩苷|金属有机骨架复合磁性材料([email protected])|制备路线
Flutter动态化 | Fair 2.5.0 新版本特性
[redis] cache warm-up, cache avalanche and cache breakdown
JS general form submission 1-onsubmit
[combinatorics] permutation and combination (examples of combinatorial number of multiple sets | three counting models | selection problem | combinatorial problem of multiple sets | nonnegative intege
Flutter dynamic | fair 2.5.0 new version features
Go: send the get request and parse the return JSON (go1.16.4)
SQL Injection (AJAX/JSON/jQuery)