全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

JVM内存管理之JAVA语言的内存管理详解

引言

内存管理一直是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内存区域管理详解  # 这一  # 这部  # 是一个  # 内存管理  # 管理系统  # 是在  # 是由  # 自己的  # 的是  # 就会  # 不需要  # 结构图  # 则是  # 是指  # 最重要  # 它是  # 量表  # 给大家  # 平时  # 常说 


相关文章: 建站主机选购指南:核心配置与性价比推荐解析  如何用IIS7快速搭建并优化网站站点?  建站主机是否属于云主机类型?  如何配置FTP站点权限与安全设置?  电商平台网站制作流程,电商网站如何制作?  相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  建站VPS选购需注意哪些关键参数?  如何通过虚拟主机空间快速建站?  如何通过多用户协作模板快速搭建高效企业网站?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  如何快速生成专业多端适配建站电话?  c++怎么用jemalloc c++替换默认内存分配器【性能】  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  高端云建站费用究竟需要多少预算?  网站制作难吗安全吗,做一个网站需要多久时间?  如何通过远程VPS快速搭建个人网站?  如何设置并定期更换建站之星安全管理员密码?  高防服务器如何保障网站安全无虞?  如何通过VPS搭建网站快速盈利?  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  网站制作大概多少钱一个,做一个平台网站大概多少钱?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  红河网站制作公司,红河事业单位身份证如何上传?  在线制作视频网站免费,都有哪些好的动漫网站?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  如何获取开源自助建站系统免费下载链接?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  用v-html解决Vue.js渲染中html标签不被解析的问题  如何挑选最适合建站的高性能VPS主机?  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  公司网站的制作公司,企业网站制作基本流程有哪些?  如何制作一个表白网站视频,关于勇敢表白的小标题?  已有域名如何免费搭建网站?  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  代刷网站制作软件,别人代刷火车票靠谱吗?  电脑免费海报制作网站推荐,招聘海报哪个网站多?  西安专业网站制作公司有哪些,陕西省建行官方网站?  如何规划企业建站流程的关键步骤?  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  子杰智能建站系统|零代码开发与AI生成SEO优化指南  建站ABC备案流程中有哪些关键注意事项?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  ,石家庄四十八中学官网?  建站之星安装模板失败:服务器环境不兼容?  建站之星如何通过成品分离优化网站效率? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。