前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >jvm┃java内存区域,跳槽大厂必会知识点!

jvm┃java内存区域,跳槽大厂必会知识点!

作者头像
moon聊技术
发布于 2021-07-28 09:54:35
发布于 2021-07-28 09:54:35
2530
举报
文章被收录于专栏:moon聊技术moon聊技术

目录

  • 目录
  • 前言
  • 正文
    • 1.程序计数器
    • 2.虚拟机
    • 3.本地方法栈
    • 4.堆
    • 5.方法区
    • 6.直接内存
  • 结语

前言

java的使用过程当中,我们会发现java的内存是自己释放的,并不像C、C++代码那样,每一块儿内存都需要程序员自己去维护,但是在如此便捷的同时可能也会出现很多问题,比如内存溢出内存泄漏更不好排查了,所以今天的文章中,moon会带大家先了解java的内存区域的到底是怎样的,以及各个组件的作用是什么,让你一点一点翻越虚拟机内存管理这座大山。

正文

我们先来看一张图:

这张图就是一个java虚拟机运行时数据图,深色区域代表是线程共享的区域,java程序在运行的过程中会把他管理的内存划分为若干个不同的数据区域,每一块儿的数据区域所负责的功能都是不同的,他们也有不同的创建时间和销毁时间,本文将会从这张图开始一一展开,清晰的告诉你每一个模块的作用。

1.程序计数器

程序计数器就像是控制城市交通的红绿灯一样,是整个系统的中枢。在jvm中,它就是程序控制流的指示器,循环,跳转,异常处理,线程的恢复等工作都需要依赖程序计数器去完成。 程序计数器是线程私有的,它的生命周期是和线程保持一致的,我们知道,N个核心数的CPU在同一时刻,最多有N个线程同时运行,在我们真实的使用过程中可能会创建很多线程,jvm的多线程其实是通过线程轮流切换,分配处理器执行时间来实现的。既然涉及的线程切换,所以每条线程必须有一个独立的程序计数器。

2.虚拟机栈

虚拟机栈,其描述的就是线程内存模型,也可以称作线程栈,也是每个线程私有的,生命周期与线程保持一致。在每个方法执行的时候,jvm都会同步创建一个栈帧去存储局部变量表,操作数栈,动态连接,方法出口等信息。一个方法的生命周期就贯彻了一个栈帧从入栈到出栈的全部过程。 局部变量表应该是我们接触的最多的,里面存储了java的8大基本数据类型(byte、short、char、int、float、long、double、boolean)、对象引用(reference类型,不是对象本身,是指向对象的引用)和returnAddress类型(指向一条字节码指令的地址)。局部变量表的存储单位是局部变量槽(slot),long和double类型会占据两个变量槽,其余类型只占用一个,但是每一个变量槽的大小是由jvm自己决定的。

3.本地方法栈

本地方法栈的概念很好理解,我们知道,java底层用了很多c的代码去实现,而其调用c端的方法上都会有native,代表本地方法服务,而本地方法栈就是为其服务的。

4.堆

堆可以说是jvm中最大的一块儿内存区域了,它是所有线程共享的,不管你是初学者还是资深开发,多少都会听说过堆,毕竟几乎所有的对象都会在堆中分配。

我们先从分配内存的角度看看堆是怎么样的

其实这就是一个最真实的堆,可能有些同学会觉得我说的不对,应该还有新生代,老年代,永久代,伊甸区,servivor区等等。这种说法基于某种逻辑上说是对的,但是并不是标准,它只是某些垃圾回收器的设计理念,需要新生代,老年代收集器搭配才能工作。

我们来说说TLAB(thread local allocation buffer),TLAB的数量和线程数是一一对应的,也就是说,TLAB是线程私有的,在堆空间中分配,对象会首先存放在这个线程私有的TLAB中,可以提升线程分配的效率。

5.方法区

方法区也是所有线程共享的区域,它存储了被jvm加载的类型信息、常量、静态变量等数据。 运行时常量池就是方法区的一部分,编译期生成的各种字面量与符号引用就存储在其中。

6.直接内存

这部分数据并不是jvm运行时数据区的一部分,nio就会使用到直接内存,也可以说堆外内存,通常会配合虚引用一起去使用,就是为了资源释放,会将堆外内存开辟空间的信息存储到一个队列中,然后GC会去清理这部分空间。

堆外内存优势在 IO 操作上,对于网络 IO,使用 Socket 发送数据时,能够节省堆内存到堆外内存的数据拷贝,所以性能更高。看过 Netty 源码的同学应该了解,Netty 使用堆外内存池来实现零拷贝技术。对于磁盘 IO 时,也可以使用内存映射,来提升性能。另外,更重要的几乎不用考虑堆内存烦人的 GC 问题。但是既然是内存。也会受到本机总内存的限制,

结语

今天和大家聊了聊java内存区域是怎样的,而这部分内容都是比较标准化得一个体现,并没有掺杂垃圾回收相关的知识,也没有掺杂jvm具体实现的相关逻辑,我们知道这是一个基础的架构,我们在开发中默认使用的jvm是hotspot,它是SunJDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机,他们都是基于jvm规范去开发的,所以了解规范之后再去学其他深入的实现,不要各个知识点紊乱的去学。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 moon聊技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java内存区域有哪些构成?
Java 内存区域, 也叫运行时数据区域、内存区域、JVM内存模型,和 Java 虚拟机(JVM)的运行时区域相关,是指 JVM运行时将数据分区域存储,强调对内存空间的划分。 经常与Java内存模型(JMM)混淆,其定义了程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。 JVM并不是只有唯一版本的,在Java发展历史中,有许多优秀的Java虚拟机,其中目前大家最熟悉的就是HotSpot虚拟机,什么你不知道?
Jensen_97
2023/07/19
3320
Java内存区域有哪些构成?
JVM简介—1.Java内存区域
Java虚拟机在执行Java程序的过程中,会把它所管理的内存划分为若干个不同的数据区域,这些区域各有各的用途以及各自的创建和销毁时间也不一样。有的区域会随着虚拟机的进程启动而存在,有的区域则依赖用户线程的启动和结束而进而跟着建立和销毁。
东阳马生架构
2025/03/10
390
【JVM进阶之路】二:Java内存区域
Java 虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创建和销毁。
三分恶
2021/04/01
3520
【JVM进阶之路】二:Java内存区域
可能是把Java内存区域讲的最清楚的一篇文章
对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序员把内存控制权利交给 Java 虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。
Java知音
2018/09/26
4500
【JAVA】JVM 内存区域的划分
本博文将从内存管理的角度,进一步探索 Java 虚拟机(JVM)。垃圾收集机制为我们打理了很多繁琐的工作,大大提高了开发的效率,但是,垃圾收集也不是万能的,懂得 JVM 内部的内存结构、工作机制,是设计高扩展性应用和诊断运行时问题的基础,也是 Java 工程师进阶的必备能力。
sidiot
2023/08/31
2480
【JAVA】JVM 内存区域的划分
JVM 内存区域方面
对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序员把内存控制权利交给 Java 虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。
Java团长
2019/05/28
3660
JVM-Java内存区域
JVM在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,都有着各自的用途以及创建和销毁时间。包括以下几个如图所示的运行时数据区域:
WindCoder
2018/09/19
8040
JVM-Java内存区域
一、JVM内存区域详解
Java中虚拟机在执行Java程序的过程中会将它所管理的内存区域划分为若干不同的数据区域。下面来介绍几个运行时数据区域。
栋先生
2018/09/29
7120
一、JVM内存区域详解
Java内存区域
  程序计数器(Program Counter Register)是一块较小的内存区域,是当前线程执行的字节码的行号指示器。程序计数器是一块私有的内存区域,每个线程都有一个独立的程序计数器。如果线程正在执行的是一个Java方法,这个程序计数器记录的是正在执行的虚拟机字节码指令地址;如果正在执行的是Native方法,这个计数器值则为空(Undefined)。程序计数器所在的内存区域是唯一一个在Java虚拟机没有OOM(OutOfMemoryError)情况的区域。
GreizLiao
2022/05/11
2850
Java内存区域与内存溢出异常
Tips:如果执行的Java方法,计数器记录的是虚拟机字节码指令的地址,如果是native方法,计数器的值为空(Undefined)
承苏凯
2020/07/24
2.2K0
Java内存区域与内存溢出异常
JVM的内存区域划分
学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆、栈以及静态数据区。那么在Java语言当中,内存又是如何划分的呢?
Java架构师历程
2018/09/26
9910
JVM的内存区域划分
jvm系列之内存区域
   想要了解jvm,那对其内存分配管理的学习是必不可少的;java虚拟机在执行java程序的时候会把它所管理的内存划分成若干数据区域。这些区域有着不同的功能、用途、创建/销毁时间。java虚拟机所分配管理的内存区域如图1所示
六个核弹
2022/12/23
1960
jvm系列之内存区域
JVM内存区域
JVM虚拟机,也就是虚拟的计算机,它有自己虚拟的CPU、虚拟的内存等等,当然还有大名鼎鼎的垃圾回收器。第一篇我们来讲解一下JVM的虚拟内存。
用户4439777
2020/08/01
9530
一问带你彻底了解JVM-Java内存区域详解
Java内存模型在1.8之前和1.8之后略有不同,也就是运行时数据区域,请看如下图:
@派大星
2023/06/28
4570
一问带你彻底了解JVM-Java内存区域详解
JVM的内存区域划分
学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆、栈以及静态数据区。那么在Java语言当中,内存又是如何划分的呢?
哲洛不闹
2018/12/26
7120
JVM性能优化系列-(1) Java内存区域
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。主要包括:程序计数器、虚拟机栈、本地方法栈、Java堆、方法区(运 行时常量池)、直接内存。
码老思
2023/10/19
3790
JVM性能优化系列-(1) Java内存区域
Java内存区域
对于c++选手来说, 内存管理是一项基本功,因为c++没有自带的管理技术, 所以c++开发人员需要自己对实现的所有代码进行内存管理。 虽然说Java实现了一套自己的内存管理机制, 这让Java程序员可以全心投入到需求开发中去, 不需要对内存做太多了的了解。 但是问题也正是出现在这里, 因为不知道虚拟机是怎么使用内存的,所以出了问题也是无从下手,不知道具体哪里出了问题。 所以这些都是我们Java程序员需要了解和掌握的内存管理技术的原因。
用户11097514
2024/05/31
1470
Java内存区域
JVM 内存区域划分详解
一个 Java 程序, 首先经过 javac 编译成 .class 文件, 然后 JVM 将其加载到方法区, 执行引擎将会执行这些字节码。 执行时, 会翻译成操作系统相关的函数。 JVM 作为 .class 文件的翻译存在, 输入字节码, 调用操作系统函数。
程序员子龙
2023/12/18
3560
JVM内存区域认识
这是一张图🐰 区域介绍 程序计数器 程序计数器是一块较小的内存空间,它可以被看作是指示当前线程执行的字节码的行号指示器。(即记录当前的执行位置) 在虚拟机的概念模型里,字节码解释器就是通过改变计数器得之来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 由于Java虚拟机的多线程是通过轮流切换并分配处理器执行执行时间来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程种的指令。因此,线程为了切换后能恢复到正
高大北
2022/06/14
2190
JVM内存区域认识
Java内存管理原理及内存区域详解
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干不同的数据区域,这些区域都有各自的用途以及创建和销毁的时间。Java虚拟机所管理的内存将会包括以下几个运行时数据区域,如下图所示:
哲洛不闹
2018/09/19
4880
Java内存管理原理及内存区域详解
相关推荐
Java内存区域有哪些构成?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文