一文详解JVM的内存结构

news2024/11/24 11:48:25

目录

前言

内存结构

 程序计数器

虚拟机栈

 本地方法栈

 堆内存

方法区

 内部组成


前言

  • Java的JVM解决的问题是跨操作系统问题。程序员只需要专注于代码的编写,这些代码能够在不同的操作系统Mac,Linux和Windows运行的前提是JVM。
  • JVM还提供了垃圾回收机制,这是一个围城,外面的人想进来,里面的人想出去。

内存结构

JVM的内存结构主要分为5部分,程序计数器,虚拟机栈,本地方法栈,堆和方法区。

  • 其中虚拟机栈程序计数器本地方法栈是线程安全的即线程私有
  • 方法区是线程不安全区域,也是变量或者引用类型存放的地方,也是垃圾回收主要面对的区域。

 如下图所示,我们可以看到JVM的全貌

 程序计数器

  • 作用,是记住下一条jvm指令的执行地址
  • 特点
    • 是线程私有的
    • 不会存在内存溢出

当线程发生上下文切换时候,这时候,程序还想顺序执行,程序计数器就发挥了重大作用。

虚拟机栈

特点 

  • 每个线程运行时所需要的内存,称为虚拟机栈
  • 每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存
  • 每个线程当前时刻只能有一个活动栈帧,对应着当前正在执行的那个方法
  • -Xss 为jvm启动的每个线程分配的内存大小,默认JDK1.4中是256K,JDK1.5+中是1M
  1. 从其特点可以看出,虚拟机栈是线程私有的。因为每个线程都有一个虚拟机栈。每个虚拟机栈也会消耗一定内存。因此如果线程数过多会发生内存溢出问题。
  2. 每个方法对应一个栈帧,当我们递归调用写成无线调用时,就会发生栈溢出问题。
  3. 每个栈帧对应每个方法,每个方法中又存在局部变量,这些局部变量是否线程安全?
    • 当局部变量的作用域仅在这个方法中,那么它是线程安全的。
    • 如果局部变量引用了对象,并逃离了方法的作用范围,那么它是线程不安全的

 本地方法栈

本地方法栈和虚拟机栈发挥的作用是非常相似的,

  • 它们之间的区别不过在于虚拟机栈为虚拟机执行执行Java方法;
  • 本地方法栈为虚拟机执行的是Native方法服务。

 堆内存

特点

  • 通过 new 关键字,创建对象都会使用堆内存
  • 它是线程共享的,堆中对象都需要考虑线程安全的问题
  • 有垃圾回收机制
  • 通过Xms和-Xms控制堆的大小
    • -Xms:为jvm启动时分配的内存
    • Xmx:为jvm运行过程中分配的最大内存,比如-Xms500m,表示jvm进程最多只能够占用500M内存

堆内存诊断

1. jps 工具

  • 查看当前系统中有哪些 java 进程

2. jmap 工具

  • 查看堆内存占用情况 jmap - heap 进程id

3. jconsole 工具

  • 图形界面的,多功能的监测工具,可以连续监测

方法区

 内部组成

以1.8为例,方法区是JVM内存的一个概念,它具体使用元空间实现的。

 运行时常量池

  • 常量池,就是一张表是Class文件中一部分,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等信息
  • 常量池是 *.class 文件中的,当该类被加载,它的常量池信息就会放入运行时常量池,并把里面的符号地址变为真实地址

了解了JVM的内存结构可以关注一下对象是如何创建的

JVM—对象的创建_兜兜转转m的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/28259.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux终端操作-Xshell和Xftp(家庭版)

目录一,终端操作二,软件安装1,Xshell, Xftp下载2,Xshell安装3,Xftp安装三,使用1,Xshell建立连接2,Xftp上传文件一,终端操作 上一篇博客记录了如何本地安装虚拟机并实现本…

SpringSecurity(十五)---OAuth2的运行机制(上)-OAuth2概念和授权码模式讲解

一、前言 鸽了很久,其实也因为自己确实比较忙,加之自己在造demo的时候也遇到了很多问题,并且网上这方面的解答非常之少,不过也正是因为少,才更加让我想写这样的知识分享,最终,在一篇博客的解答…

中文drupal教程(4)Session会话系统

Session(会话)在网站中扮演非常重要的角色,储存临时用户数据、登录数据等等都用到了它,Drupal使用到了Symfony的Session组件,该组件非常强大灵活,drupal在此基础上有所改造和扩展,要理解Symfony…

企业微信接口测试实战(一)

本文为在霍格沃兹测试开发学社中学习到的一些技术,写出来分享给大家,希望有志同道合的小伙伴可以一起交流技术,一起进步~ 霍格沃茨启发: 测试开发进阶班>接口自动化测试>企业微信接口测试实战 企业微信接口测试实战 一、准备环境二、脚本实现2.1、 获得access_token2…

防火墙用户管理理论+实验

目录 注:实验需要有安全策略配置、NAT配置基础 一、防火墙用户管理重要知识点 用户管理 访问控制策略 NGFW下一代防火墙 AAA 鉴别方式——认证 用户认证的分类: 上网用户上线流程: 二、用户认证实验: 实验拓扑 先配置防…

pmp考试是什么?

PMP是一个全球资格认证,也是目前项目管理领域大家公认的证书,相当于项目管理的入门证书。 一、PMP 是什么 pmp 中文叫项目管理专业人士资格认证,目前项目管理领域大家公认的证书,是一个用来评估项目管理人员的知识技能是否已经达…

D. Divide and Summarize(BFS+二分+预处理)

Problem - 1461D - Codeforces 迈克收到一个长度为n的数组作为生日礼物,决定测试一下它的漂亮程度。 如果有一种方法可以通过一定数量(可能是零)的切片操作得到一个元素总和为si的数组,那么这个数组将通过第i次漂亮度测试。 一个…

红红火火的VB,悄然离去,新型中文编程,如日中天

“悲哀!现在用VB连1200都赚不到。”一位VB程序员有感而发。曾经红红火火的VB编程语言,如今却徘徊在被淘汰边缘,让人惋惜。 依稀记得,读大学时候,有一位财务专业同学,特别喜欢计算机,有空就自学V…

密码学引论 | DES

文章目录DES算法1 算法流程2 算法细节(1)子密钥的产生(2)初始置换IPIPIP(3)加密函数(4)逆初始置换IP−1IP^{-1}IP−1例题DES算法 1 算法流程 64位密钥经子密钥产生算法产生出16个子…

用 TypeScript 类型运算实现一个五子棋游戏

之前有看到有大佬用类型运算实现了中国象棋程序 和 Lisp 解释器 甚是震惊,之前不太会看不懂。 最近也学了点类型体操的内容想着自己也玩一下。选择五子棋的原因是相对来说规则是更简单一些的也比较好实现。此实现没有考虑性能上优化和最佳实现方式只关注功能的实现…

详细步骤讲解matlab代码通过Coder编译为c++并用vs2019调用

项目上需要C,奈何本人不会,所以就用matlab写好测试后,用matlab Coder编译为c并用vs2019调用 一个简单的例子,求取两个4*4矩阵相加后,在求取最大值与最小值。matlab代码如下 function [a,b] min_max(m,n)temp mn;a m…

STM32F407 电机编码器测量

文章目录一、STM32F407 定时器编码器功能1.1 STM32定时器简介1.2 STM32定时器编码器功能二、带编码器的直流电机三、代码与验证3.1 初始化代码3.2 验证一、STM32F407 定时器编码器功能 1.1 STM32定时器简介 STM32的定时器功能非常强大,根据官方手册,定…

旅游网页设计 web前端大作业 全球旅游私人订制 旅游公司网站模板(HTML+CSS+JavaScript)

👨‍🎓学生HTML静态网页基础水平制作👩‍🎓,页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码,这是一个不错的旅游网页制作,画面精明,排版整洁,内容…

OctaneRender界面布局自定义界面教程丨使用教程

您可以通过单击并拖动每个窗格左上角的方块(图 1)来重新排列 OctaneRender 界面(图形编辑器、渲染视口、节点检查器和大纲视图)中每个窗格的窗口。 图 1:窗格排列图标 用任何鼠标按钮单击同一个方块会显示更多用于…

SpringBoot SpringBoot 开发实用篇 5 整合第三方技术 5.20 ActiveMQ 安装

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇5 整合第三方技术5.20 ActiveMQ 安装5.20.1 下载5.20.2 安装5.20.3 使…

[附源码]SSM计算机毕业设计基于的城镇住房公积金管理系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Unity Hair 毛发系统 初体验

文章目录🎈 简介🎈 所需环境🎈 下载安装🎈 使用初体验🍭 创建一个Hair示例🍭 Hair Asset🍭 尝试给Avatar创建头发🍭 如何更改材质🎈 简介 8月份的时候Unity官方发布了Ha…

第7章 Elasticsearch面试题

7 . 1 为什么要使用Elasticsearch? 系统中的数据,随着业务的发展,时间的推移,将会非常多,而业务中往往采用模糊查询进行数据的搜索,而模糊查询会导致查询引擎放弃索引,导致系统查询数据时都是全表扫描&am…

即将见面:SpreadJS V16:重大改进

内容摘自互联网::::::: 新功能背景:在SpreadJS V16之前,关于文件toJSON()之后,生成的json文件太大,一直被很多客户诟病。例如,同样一…

PySide创建界面关联项目(五) 百篇文章学PyQT

本文章是百篇文章学PyQT的第五篇,本文讲述如何使用PySide创建UI界面,并且关联入PyCharm 新建的项目中成功运行第一个PyQT程序,博主在本篇文章中将遇到和踩过的坑总结出来,可以供大家参考,希望大家安装顺利。包括 安装、…