引言

内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑。不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓狂的内存溢出和泄露的问题。
可怕的事情还不只如此,有些使用其它语言开发的程序员,给JAVA程序员扣上了一个“不懂内存”的帽子,这着实有点让人难以接受。毕竟JAVA当中没有malloc和delete、没有析构函数、没有指针,刚开始接触JAVA的程序员们又怎么可能接触内存这一部分呢,更何况有不少JAVA程序员还是跳了专业半路出家的朋友。
不过事实尽管难以接受,但也确实有不少JAVA程序员对内存这部分可谓一窍不知,尽管掌握内存的相关知识,或许并不能给平时的开发带来翻天覆地的变化和好处,不过它仍然会潜移默化的提高你的技术水准,这一点在了解完内存管理之后,相信各位就会深有体会了。
内存划分
谈到内存这一词汇,它是在程序运行时才有的数据存储区域,而对于这一块区域的划分,各个虚拟机有各自的划分方式,不过它们都必须遵从JAVA虚拟机的基本规范去实现。
虚拟机规范中,将内存划分为六大部分,分别是PC寄存器、JAVA虚拟机栈、JAVA堆、方法区、运行时常量池以及本地方法栈。
JAVA虚拟机规范与JAVA虚拟机
这里还需要解释一下JAVA虚拟机规范和JAVA虚拟机的区别,顾名思义,JAVA虚拟机规范是一种对JAVA虚拟机实现的规范要求,是由oracle制定的,而我们平时常说的JAVA虚拟机一般是指的一种具体的JAVA虚拟机规范的实现。比如我们最经常使用的JAVA虚拟机hotspot,其实JAVA虚拟机还有很多种实现,甚至如果你对JAVA虚拟机规范有了深入的了解而且对此有兴趣的话,可以写一个自己的JAVA虚拟机,当然这其中的难度不难想象。
结构图
下图是引用于百度文库的一张JVM的结构图,由于运行时常量池是由方法区分配出来的区域,所以此图当中没有运行时常量池。
内存区域详解
针对上面这张图,内存就是指的矩形框当中运行期数据区这部分,下面简单介绍一下各个部分的作用:
1、PC寄存器(线程独有):全称是程序计数寄存器,它记载着每一个线程当前运行的JAVA方法的地址,如果是当前执行的是本地方法,则程序计数器会是一个空地址。它的作用就是用来支持多线程,线程的阻塞、恢复、挂起等一系列操作,直观的想象一下,要是没有记住每个线程当前运行的位置,又如何恢复呢。依据这一点,每一个线程都有一个PC寄存器,也就是说PC寄存器是线程独有的。
2、JAVA虚拟机栈(线程独有):JAVA虚拟机栈是在创建线程的同时创建的,用于存储栈帧,JAVA虚拟机栈也是线程独有的。
栈帧:简单点说,可以解释为是一个方法运行时,临时数据的存储区域,具体点说,它里面包括了数据和部分的过程结果,与此同时,它又肩负着处理方法返回值、动态链接以及异常分派的任务。栈帧是随着方法的创建而创建,随着方法的结束而销毁,如果方法抛出异常,也算方法结束。然而在每一个栈帧中,都有着自己的局部变量表以及操作数栈以及对当前类的运行时常量池的引用。
局部变量表:它是一个方法局部变量的列表,是在编译时期就写入了class文件当中。简单的理解,可以将它理解为一个对象数组,而里面按照索引0到length-1分别对应于每一个局部变量,特别的,如果是实例方法的局部变量表,第0个局部变量会是一个指向当前实例的引用,也就是this关键字,其余的局部变量则从索引1开始。
操作数栈:它是一个后进先出(pFO)栈,而它的长度也是在编译时期就写入了class文件当中,是固定的。它的作用就是提供字节码指令操作变量计算的空间,比如简单的,对于int a=9这句话来说,就需要先将9压入操作数栈,再将9赋给a这个变量。
3、JAVA堆(全局共享):这一部分是JAVA内存中最重要的一部分,之所以说是最重要的一部分,并不是因为它的重要性,而是指作为开发人员最应该关注的一部分。它随着JAVA虚拟机的启动创建,储存着所有对象实例以及数组对象,而且内置了“自动内存管理系统”,也就是我们常说的垃圾搜集器(GC)。JAVA堆中的内存释放是不受开发人员控制的,完全由JAVA虚拟机一手操办。对于JAVA虚拟机如何实现垃圾搜集器,JAVA虚拟机规范没有明确的规定,也正因如此,我们平时使用的JAVA虚拟机中提供了许多种垃圾搜集器,它们采用不同的算法以及实现方式,已满足多方面的性能需求。
4、方法区(全局共享):方法区也是堆的一个组成部分,它主要存储的是运行时常量池、字段信息、方法信息、构造方法与普通函数的字节码内容以及一些特殊方法。它与JAVA堆的区别除了存储的信息与JAVA堆不一样之外,最大的区别就是这一部分JAVA虚拟机规范不强制要求实现自动内存管理系统(GC)。
5、本地方法栈(线程独有):本地方法栈是一个传统的栈,它用来支持native方法的执行。如果JAVA虚拟机是使用的其它语言实现指令集解释器的时候,也会用到本地方法栈。如果前面这两种都未发生,也就是说如果JAVA虚拟机不依赖于本地方法栈,而且JAVA虚拟机也不支持native方法,则不需要本地方法栈。而如果需要的话,则本地方法栈也是随每一个线程的启动而创建的。
上面五个内存区域,除了PC寄存器之外,其余四个一般情况下,都要求JAVA虚拟机实现提供给客户调节大小的参数,也就是我们常用的Xms、Xmx等等。
内存管理
内存管理分为内存分配和内存释放,看一下上面的五个内存区域,其实可以大致分为两部分,一部分是全局共享,一部分是线程独有。
对于线程独有的这部分内存,都是随着线程的启动而创建,而当线程被销毁时,内存也就随之释放。这一部分内存,不需要垃圾搜集器的管理,而是JAVA虚拟机来主动管理,每当一个线程被创建的时候,JAVA虚拟机就会为其分配相应的PC寄存器和JAVA虚拟机栈,如果需要的话,还会有本地方法栈。相应的,当一个线程被销毁的时候,JAVA虚拟机也会将这个线程所占有的内存全部释放。
相对于线程独有的那部分内存,全局共享的这部分内存更加难以处理,不过这只是针对于虚拟机的实现来说,因为这一部分内存是要实现自动内存管理系统(GC)的。
全局共享的这部分内存(以下简称堆),内存分配主要是由程序员显示的使用new关键字来触发的,至于new出来的这部分内存在哪分配,如何分配,则是JAVA虚拟机来决定。而这部分内存的释放,则是由自动内存管理系统(以下简称GC)来管理的。
通常情况下,堆内存分配是要依赖于GC的策略与实现的,在分配的时候,就要考虑好到时候如何回收这部分内存。也是正因为如此,对于内存分配这一部分的讲解来说,我们必须得先了解内存是如何被回收的,才能更好的理解内存要怎么被分配。
结束语
本次对于JAVA语言中内存管理的概述就到此结束了。
以上这篇JVM内存管理之JAVA语言的内存管理详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# JVM内存管理
# 从JVM的内存管理角度分析Java的GC垃圾回收机制
# 详解Java虚拟机管理的内存运行时数据区域
# 浅谈java内存管理与内存溢出异常
# 详解Java内存管理中的JVM垃圾回收
# java虚拟机深入学习之内存管理机制
# 详解JAVA 内存管理
# java内存管理关系及内存泄露的原理分析
# Java内存区域管理详解
# 这一
# 这部
# 是一个
# 内存管理
# 管理系统
# 是在
# 是由
# 自己的
# 的是
# 就会
# 不需要
# 结构图
# 则是
# 是指
# 最重要
# 它是
# 量表
# 给大家
# 平时
# 常说
相关文章:
建站之星在线版空间:自助建站+智能模板一键生成方案
子杰智能建站系统|零代码开发与AI生成SEO优化指南
无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?
如何在服务器上三步完成建站并提升流量?
详解jQuery中基本的动画方法
太平洋网站制作公司,网络用语太平洋是什么意思?
如何零基础在云服务器搭建WordPress站点?
如何快速搭建支持数据库操作的智能建站平台?
宝塔新建站点报错如何解决?
如何选择最佳自助建站系统?快速指南解析优劣
大连网站设计制作招聘信息,大连投诉网站有哪些?
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
,巨量百应是干嘛的?
如何在宝塔面板中创建新站点?
安云自助建站系统如何快速提升SEO排名?
如何将凡科建站内容保存为本地文件?
哈尔滨网站建设策划,哈尔滨电工证查询网站?
如何基于云服务器快速搭建个人网站?
如何在IIS中新建站点并解决端口绑定冲突?
制作网页的网站有哪些,电脑上怎么做网页?
家庭建站与云服务器建站,如何选择更优?
建站主机是否属于云主机类型?
C++如何编写函数模板?(泛型编程入门)
c# Task.ConfigureAwait(true) 在什么场景下是必须的
如何快速搭建个人网站并优化SEO?
定制建站方案优化指南:企业官网开发与建站费用解析
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
如何在云主机上快速搭建网站?
如何快速生成ASP一键建站模板并优化安全性?
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
免费公司网站制作软件,如何申请免费主页空间做自己的网站?
如何在新浪SAE免费搭建个人博客?
音乐网站服务器如何优化API响应速度?
如何通过西部建站助手安装IIS服务器?
网站插件制作软件免费下载,网页视频怎么下到本地插件?
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
c# 服务器GC和工作站GC的区别和设置
微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?
招商网站制作流程,网站招商广告语?
建站主机解析:虚拟主机配置与服务器选择指南
如何高效利用亚马逊云主机搭建企业网站?
Swift中switch语句区间和元组模式匹配
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
如何选择香港主机高效搭建外贸独立站?
如何解决ASP生成WAP建站中文乱码问题?
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
建站之星备案流程有哪些注意事项?
制作公司内部网站有哪些,内网如何建网站?
视频网站app制作软件,有什么好的视频聊天网站或者软件?
专业网站建设制作报价,网页设计制作要考什么证?
*请认真填写需求信息,我们会在24小时内与您取得联系。