当前位置: 首页 > news >正文

【JVM虚拟机面试宝典】JVM的内存结构是怎么样的?在JVM中会发生内存溢出的区域有那些?— day06

目录

说说JVM 内存区域?

JVM的内存结构是怎么样的?

 在JVM中会发生内存溢出的区域有那些?

方法区、永久代、元空间有什么区别?


说说JVM 内存区域?

运行时内存划分如下区域:

方法区:存放类,静态变量,静态方法,常量(常量不等同于常量值,基本类型都属于常量值)

(局部常量,成员常量,静态常量),成员方法,线程不安全

堆区:存放分配的对象,线程不安全

栈区:存放局部变量,以及运行的方法.

程序计数器:记录当前线程走到哪一步了.

本地方法栈:运行本地方法,一般是其他语言(本地方法相当于库函数,封装了对操作系统的


JVM的内存结构是怎么样的?

说明

加粗字体代表了 JVM 虚拟机组件对于 Oracle 的 Hotspot 虚拟机实现,不区分虚拟机栈和本地方法栈

 以一个类为例,该类最底层的就是源代码,java Source是以.java结尾的源码文件。

通过javac命令编译源代码为字节码,以.class结尾的文件,

然后执行java命令运行,

创建 JVM,调用类加载子系统加载 class,将类的相关信息存入方法区

创建 main 线程,是主线程被称为入口线程,使用的内存区域是JVM 虚拟机栈,开始执行 main 方法代码

如果遇到了未见过的类,会继续触发类加载过程,同样会存入方法区

需要创建的对象,会使用堆内存来存储对象

不再使用的对象,会由垃圾回收器在内存不足时回收其内存

调用方法时,方法内的局部变量、方法参数所使用的是 JVM 虚拟机栈中的栈帧内存

调用方法时,先要到方法区获得到该方法的字节码指令,由解释器将字节码指令解释为机器码执行

调用方法时,会将要执行的指令行号读到程序计数器,这样当发生了线程切换后,恢复时就可以从中断的位置继续运行

对于非 java 实现的方法调用,例如hashCoed(),使用内存称为本地方法栈(见说明)

对于热点方法调用,或者频繁的循环代码,由 JIT 即时编译器将这些代码编译成机器码缓存,在需要使用的时候直接从缓存中拿就可以了,提高了执行性能。

 在JVM中会发生内存溢出的区域有那些?

除了不会出现的内存溢出区域,程序计数器以外,其他都有可能出现。

出现OutOfMemoryError(内存不足错误)的情况:

  1. 堆内存耗尽—》对象越来越多,又一直在使用,不能被垃圾回收。
  2. 方法区内存耗尽—》加载的类越来越多,或者很多框架都会在运行期间动态产生新的类。
  3. 虚拟机栈累积—》每个线程最多会占用1M内存,线程个数越来越多,而又长时间运行不销毁时。

出现StackOverflowErro(堆叠溢出错误)的情况:

  1. JVM虚拟机栈,原因有方法递归调用未正确结束,反序列化json时循环引用。


方法区、永久代、元空间有什么区别?

方法区:是 JVM 规范中定义的一块内存区域,用来存储类元数据、方法字节码、即时编译器需要的信息等

永久代:是 Hotspot 虚拟机对 JVM 规范的实现(1.8 之前)

元空间:是 Hotspot 虚拟机对 JVM 规范的另一种实现(1.8 以后),使用本地内存作为这些信息的存储空间

堆内存中:当一个类加载器对象,这个类加载器对象加载的所有类对象,这些类对象对应的所有实例对象都没人引用时,GC 时就会对它们占用的对内存进行释放

元空间中:内存释放以类加载器为单位,当堆中类加载器内存释放时,对应的元空间中的类元信息也会释放。

相关文章:

  • C++ string类
  • 细数那些惊艳一时的 CSS 属性
  • 【C语言】你真的了解结构体吗
  • 可做题2(矩阵快速幂,乘法逆元,exgcd)
  • Mysql用户权限分配详解
  • 一文7个步骤从0到1教你搭建Selenium 自动化测试环境
  • 【网络安全工程师】从零基础到进阶,看这一篇就够了
  • 【C陷阱与缺陷】----语法陷阱
  • 解忧杂货铺(五续集):用了无法离开的网站资源
  • 功能测试转型测试开发年薪27W,又一名功能测试摆脱点点点,进了大厂
  • iOS 紧急通知
  • 艹,终于在8226上把灯点亮了
  • Linux上用Samba建立共享文件夹并通过Linux测试
  • shell简单使用介绍
  • 关于中级开发工程师常问的面试题
  • python3.6+scrapy+mysql 爬虫实战
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 〔开发系列〕一次关于小程序开发的深度总结
  • es6(二):字符串的扩展
  • Java IO学习笔记一
  • Javascript弹出层-初探
  • javascript面向对象之创建对象
  • Java知识点总结(JavaIO-打印流)
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • Netty 4.1 源代码学习:线程模型
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Python爬虫--- 1.3 BS4库的解析器
  • React-生命周期杂记
  • 初识 webpack
  • 代理模式
  • 看域名解析域名安全对SEO的影响
  • 聊一聊前端的监控
  • 使用 Docker 部署 Spring Boot项目
  • 学习JavaScript数据结构与算法 — 树
  • 由插件封装引出的一丢丢思考
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • gunicorn工作原理
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #QT(智能家居界面-界面切换)
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (10)ATF MMU转换表
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (C语言)共用体union的用法举例
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (剑指Offer)面试题34:丑数
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (全注解开发)学习Spring-MVC的第三天
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default