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

正文约: 2000字java

预计阅读时间: 6分钟程序员

文章首发于个人wexin  公众hao:moon聊技术,欢迎你们关注网络

[jvm┃java内存区域,跳槽大厂必会知识点!](https://mp.weixin.qq.com/s/pbYTN0B1yYFXSRohlq6Meg "jvm┃java内存区域,跳槽大厂必会知识点!")多线程

目录
目录
前言
正文
1.程序计数器
2.虚拟机栈
3.本地方法栈
4.堆
5.方法区
6.直接内存
结语
前言
在java的使用过程中,咱们会发现java的内存是本身释放的,并不像C、C++代码那样,每一起内存都须要程序员本身去维护,可是在如此便捷的同时可能也会出现不少问题,好比内存溢出,内存泄漏更很差排查了,因此今天的文章中,moon会带你们先了解java的内存区域的究竟是怎样的,以及各个组件的做用是什么,让你一点一点翻越虚拟机内存管理这座大山。架构

正文
咱们先来看一张图:jvm

preview
这张图就是一个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规范去开发的,因此了解规范以后再去学其余深刻的实现,不要各个知识点紊乱的去学。

下一篇文章我会和你们聊聊对象的建立和对象的内存布局相关知识。

下期见,我是moon,记得关注点赞~

相关文章
相关标签/搜索