JVM学习一:JVM运行时数据区

注:此图适合JDK 7之前的版本,JDK 8开始增加了元数据空间,内存区结构有所变化(JDK 7将字符串常量池移除了永久代,JDK 8去永久代,迎元数据空间metaspace)
1.程序计数器:程序计数器是一块较小的内存空间,它可以看作是当前线程执行的字节码的行号指示器。
2.虚拟机栈:虚拟机栈描述的是Java方法执行的内存模型,每个方法在执行时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息,方法的开始和结束对应着栈帧的出栈和入栈。递归会导致线程请求的栈深度大于虚拟机允许的深度,抛出StackOverflow异常。
3.本地方法栈:本地方法栈和虚拟机栈的作用基本相同,区别在于虚拟机栈为虚拟机执行Java方法服务,本地方法栈为虚拟机执行Native方法服务。
注:Hotspot虚拟机不区分虚拟机栈和本地方法栈,Java虚拟机规范对此没有具体要求。
4.堆:Java堆是Java虚拟机所管理的内存中最大的一块,几乎所有的对象实例以及数组都在这里分配内存,但不绝对。
5.方法区:它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
6.运行时常量池:存放编译时期生成的各种字面量和符号引用,具体在之后分析.class字节码文件时进行解释。
7.字符串常量池:它的存在主要是避免字符串的重复创建(尤其在仅仅需要获取这个字符串内容而不需要对它进行改变时),对外的接口为intern(),演示实例如下(JDK版本为1.8):
public class Main {
public static void main(String[] args) {
String test = new StringBuilder("计算机").append("软件").toString();
System.out.println(test == test.intern());
String test1 = new StringBuilder("java").toString();
System.out.println(test1.intern() == test1);
}
}
运行结果:
true
false
intern获取字符串常量池中该字符串的引用,字符串常量池只会记录首次出现的实例引用,“java”是关键字,字符串常量池中存在它的引用,新创建的实例并不是首次出现,不会放在字符串常量池中或者覆盖原有的引用,因此为false。
JVM学习一:JVM运行时数据区的更多相关文章
- 【JVM第三篇--运行时数据区】程序计数器、虚拟机栈、本地方法栈
写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.运行时数据区 我们在编写Java程序时,使用JVM的流程主要如下所示: 虚拟机在 ...
- JVM 专题十:运行时数据区(五)堆
1. 核心概述 1.1 堆概述 一个进程对应一个jvm实例,一个运行时数据区,又包含多个线程,这些线程共享了方法区和堆,每个线程包含了程序计数器.本地方法栈和虚拟机栈. 一个jvm实例只存在一个堆内存 ...
- Jvm基础(1)-Java运行时数据区
最近在看<深入理解Java虚拟机>,里面讲到了Java运行时数据区,这是Jvm基本知识,把读书笔记记录在此.这些知识属于常识,都能查到的,如果我有理解不对的地方,还请指出. 首先把图贴上来 ...
- 【JVM第四篇--运行时数据区】堆
写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.堆的概述 JVM的运行时数据区如下: 一个Java程序运行起来对应着一个进程(操 ...
- JVM内存区域(运行时数据区)划分
前言: 我们每天都在编写Java代码,编译,执行.很多人已经知道Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文 ...
- JVM系列之四:运行时数据区
1. JVM架构图 Java虚拟机主要分为五大模块:类装载器子系统.运行时数据区.执行引擎.本地方法接口和垃圾收集模块. 2. JDK1.7内存模型-运行时数据区域 根据<Java 虚拟机规范( ...
- JVM 专题十三:运行时数据区(八)直接内存
1. 直接内存 不是虚拟机运行时数据区的一部分,也不是<Java虚拟机规范>中定义的内存区域. 直接内存是Java堆外的.直接向系统申请的内存区间. 来源于NIO,通过存在堆中的Direc ...
- JVM 专题十一:运行时数据区(六)方法区
1. 栈.堆.方法区关系交互 运行时数据区结构图: 从线程共享与否的角度来看: 2. 方法区的理解 2.1 方法区在哪里? <Java虚拟机规范>中明确说明:“尽管所有的方法区在逻辑上属于 ...
- JVM 专题九:运行时数据区(四)本地方法栈
1. 本地方法栈 2. 什么是本地方法栈? Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法的调用 本地方法栈,也是线程私有的. 允许被实现成固定或者是可动态拓展的内存大小 ...
- JVM 专题八:运行时数据区(三)虚拟机栈
2.虚拟机栈 1. 概述 1.1 虚拟机栈出现背景 由于跨平台性的设计,java的指令都是根据栈来设计的.不同平台CPU架构不同,所以不能设计为基于寄存器的. 优点是跨平台,指令集小,编译器容易实现, ...
随机推荐
- XAMPP启动Apache时发生ERROR
XAMPP(Apache+MySQL+PHP+PERL)是一个功能强大的建站集成软件包,是一个易于安装且包含 MySQL.PHP 和 Perl 的 Apache 发行版.XAMPP 的确非常容易安装和 ...
- Android 音视频深入 十九 使用ijkplayer做个视频播放器(附源码下载)
项目地址https://github.com/979451341/Myijkplayer 前段时候我觉得FFmpeg做个视频播放器好难,虽然播放上没问题,但暂停还有通过拖动进度条来设置播放进度,这些都 ...
- 坦克大战学习笔记-TankWar
最近学习了马士兵老师直播的单机版坦克大战,模仿的做了一个,整理一下思路记录下来,项目git地址:https://github.com/zhuchangli/TankWar/tree/master 视频 ...
- 从excel表中生成批量SQL,将数据录入到数据库中
excel表格中有许多数据,需要将数据导入数据库中,又不能一个一个手工录入,可以生成SQL,来批量操作. 1.首先在第二行的H列,插入函数:=CONCATENATE("INSERT ...
- Java作业:第一次过程性考核 ——长春职业技术学院 16级网络工程
Java作业:第一次过程性考核 ••<结构化程序设计>•• 考核目标:初步了解Java基本语法规则,学习结构化程序设计思想. 码云链接:https://gitee.com/SoridoD/ ...
- Java String 常量池理解
String:字符串常量池 作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以提高其性能,那么字符串常量池的具体原理是什么,我们带着以下三个问题,去理解字符串常量池: 字 ...
- Oracle角色,权限,表空间基础语句
控制台: -sqlplus -----连接数据库 -conn sys/123456@orcl as sysdba -----登录sys -create tablespac ...
- Docker run 命令
docker run -d -p 8084:80 --name weather --restart always --link fme-postgis 192.168.1.220:5000/weath ...
- LeetCode 148 排序链表
题目: 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 示例 1: 输入: 4->2->1->3 输出: 1->2->3->4 示例 2 ...
- 练习 map集合被使用是因为具备映射关系 "进度班" "01" "张三" "进度班" "02" "李四" "J1701" "01" "王五" "J1701" "02" "王二" 此信息中,我们要怎样把上述信息装入集合中, 根据班级信息的到所有的所有信
package com.rf.xs; import java.util.Arrays; public class Student01 { String name; int age; public St ...