JVM - 复习
内存模型图
程序计数器(PC)
程序计数器的特点
PC是一小块内存空间,用于记录当前线程
执行的字节码指令的地址
。如果执行的是本地方法(native),PC里此时显示Undefined
优点:
- 控制程序执行流程
- 每个线程都有PC,因此可以记录每个线程当前执行的位置
特点:
- 随着线程的创建而创建,随着线程的结束而销毁
- 线程私有
- PC只是记录字节码指令的地址,因此是内存中唯一不会出现
OutOfMemoryError
(内存溢出) - PC是一小块内存空间
冷知识:PC是内存中唯一不会出现OutOfMemoryError
(内存溢出)
java虚拟机栈(java 栈)
Java栈是描述java方法运行过程的内存模型,java虚拟机栈会为每一个即将运行的java方法创建栈帧
用于存储该方法的信息。(如:局部变量表)
特点:
- Java栈通常会遇到两个异常,
StackOverFlowError
和OutOfMemoryError
StackOverFlowError
java虚拟机不允许Java栈动态扩展,当线程请求栈的深度超过了Java栈的最大深度时,就会抛StackOverFlowError
OutOfMemoryError
允许动态扩展,但可使用内存用完无法动态扩展时,抛OutOfMemoryError
- Java栈也是随线程创建而创建,随线程销毁而销毁(线程私有)
冷知识: StackOverFlowError
可能还有很多内存
本地方法栈(C栈)
本地方法栈是描述本地方法运行过程的内存模型,因为本地方法(native)通常使用c语言,因此本地方法栈也叫C栈。
本地方法栈结构和Java差不多,也会创建栈帧。但当JVM不支持native方法本地方法栈可以不被创建,否则随线程创建和销毁。
堆
堆是用于存放对象的内存空间
特点:
- 堆空间可以是不联系的内存空间
- 堆是垃圾回收的主要场所,可以分为新生代(Eden)、老年代
- JVM中只有一个,所有线程共享一个堆空间里的对象,因此需要注意多线程下的并发问题
- 堆在JVM创建的时候被创建
堆可以动态扩展,但无多余内存扩展时会抛OutOfMemoryError
。
方法区
所有的字段和字节码还有一些特殊方法(构造方法、接口)都在此定义。简单说,说有定义方法和信息都存储在此区域,此区域属于共享区间(静态变量,常量,类信息(构造方法,接口的定义),运行时常量池)
JVM - 复习的更多相关文章
- JVM复习笔记
1. JVM是什么? JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来 ...
- JVM复习总结
运行时数据区域 图中深色区域为,由所有线程共享的数据区域,其他为线程隔离的数据区. 程序计数器 程序计数器可以看作是当前线程执行的字节码的行号指示器. 虚拟机栈 虚拟机栈描述的是Java方法执行的内存 ...
- JVM复习--新生代GC
在复习Java内存机制的过程中有一些新问题,自问自答,做个记录.新生代是java堆内存的一部分.堆内存分新生代和老生代两大块,也有把堆内存分为新生代老生代永久代(持久代)三块的说法.(不过这种说法应该 ...
- 新鲜出炉!花了三天整理的JVM复习知识点,面试突击必备!
此次JVM知识点包含以下几个部分 1.类加载机制 2.jvm运行时数据区 3.java对象内存布局 4.jvm内存模型 5.垃圾回收机制 6.垃圾收集器 7.问题排查 一 类加载机制 主要说的部分是这 ...
- 高强度学习训练第四天总结:JVM+Redis
JVM 复习了JVM堆内存的几个模块. 复习了JVM的几个控制工具. 复习了JVM发展历史 Redis 复习了Redis的事务控制.
- 复习Java虚拟机:JVM中的Stack和Heap
在JVM中,内存分为两个部分,Stack(栈)和Heap(堆).这里,我们从JVM的内存管理原理的角度来认识Stack和Heap,并通过这些原理认清Java中静态方法和静态属性的问题. 一般,JVM的 ...
- JVM原理速记复习Java虚拟机总结思维导图面试必备
良心制作,右键另存为保存 喜欢可以点个赞哦 Java虚拟机 一.运行时数据区域 线程私有 程序计数器 记录正在执行的虚拟机字节码指令的地址(如果正在执行的是Native方法则为空),是唯一一个没有规定 ...
- [Java复习] JVM
Part1:Java类加载机制:类加载器,类加载机制,双亲委派模型 1. Java 类加载过程? 类加载过程即是指JVM虚拟机把.class文件中类信息加载进内存,并进行解析生成对应的class对象的 ...
- JVM虚拟机知识问答总结(简单复习,快速回忆!)
写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...
随机推荐
- Eclipse通过SVN导入项目遇到的问题记录
问题一.把子项目导入为project 原因:一个大的文件夹,里面有各个小项目,需要把自己添加需求的醒目导入为Maven Project 1.右键选 Import as project 2.右键 -&g ...
- jenkins自动化部署项目7 -- 新建job(将服务代码部署在windows上)
关于构建结束后jenkins会kill所有衍生子进程的官方解决方案:https://wiki.jenkins.io/display/JENKINS/Spawning+processes+from+bu ...
- Selenium+python操作id为动态变化的frame(iframe)
先定位到一组frame:ele = dr.find_elements_by_tag_name('iframe')此时获得一组frame 再通过index取需要切进去的frame并取到该frame的id ...
- 利用Python进行数据分析:【Matplotlib】
一.简单介绍Matplotlib 1.Matplotlib是一个强大的Python绘图和数据可视化的工具包2.安装方法:pip install matplotlib 3.引用方法:import mat ...
- SSH Config 管理多主机
使用 一般我们使用ssh连接远程主机的时候,使用命令是: ssh root@ip ssh –i [identity-file] -p [port] user@hostname 但是如果ip地址过多,其 ...
- redis-自动补全
自动补全实现方式有两种: 第一种:数据量非常小时,程序从redis中获取数据后,在程序中排序:redis只作为数据存储用: 第二种:数据量较大时,直接在redis中排序,并返回自动补全的数据. 第三种 ...
- Redis优雅实现分布式锁
文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 在实际项目开发中经常会遇到这样一个业务场景:如果同一台机器有多个线程抢夺同一个共享资源,同一个线程多次执行会出 ...
- 全网最新最简单的 OpenJDK13 代码编译
目录 开始咯 1.下载源码 2.安装编译需要的依赖 3.安装 jdk 12 4.检查配置 5.开始编译 6.验证是否成功 回顾 个人博客原文:全网最新最简单的 OpenJDK13 代码编译 最近因写文 ...
- CentOS8 yum/dnf 配置国内源
CentOS8 yum/dnf 配置国内源(临时) CentOS 8更改了软件包的安装程序,取消了 yum 的配置方法,改而使用了dnf 作为安装程序.虽然改变了软件包的安装方式,但是 dnf 还是能 ...
- git一步步上传自己的项目至github,及仓库更新
一.使用git上传项目到github 首先登陆github账号,选择新建一个库,填写项目名称,描述 创建完成之后,跳转到下面的页面,下面红框中的网址要记住,在后面上传代码的时候需要使用 接下来,我们需 ...