专栏首页moon聊技术jvm┃java内存区域,跳槽大厂必会知识点!

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

目录

  • 目录
  • 前言
  • 正文
    • 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规范去开发的,所以了解规范之后再去学其他深入的实现,不要各个知识点紊乱的去学。

本文分享自微信公众号 - moon聊技术(onetraveller_llxz),作者:moon聊技术

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-11-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JVM 面试三连问,一脸懵逼!

    周末的时候,跟他聊了下,发现原来是栽到 JVM 上面了。其实,这位朋友是位从事开发 5 年的 Java 老兵了,各种开发工具用得很熟练,但就是一触及JVM问题,...

    Java技术江湖
  • 作为一名程序员,谁没跳过槽,“6”招让你“空降”大厂

    转载自:https://blog.csdn.net/Java__xiaoze/article/details/96878759

    Java编程指南
  • Java程序员福音:通往阿里的面试通关手册,365天呕心沥血整理

    就目前大环境来看,跳槽成功的难度比往年高很多。一个明显的感受:今年的面试,无论一面还是二面,都很考验Java程序员的技术功底。这不马上又到了面试跳槽的黄金段,成...

    欧阳愠斐
  • 转:成为Java高级程序员需要掌握哪些?

    1、Core Java,就是Java基础、JDK的类库,很多童鞋都会说,JDK我懂,但是懂还不足够,知其然还要知其所以然,JDK的源代码写的非常好,要经常查看,...

    技术zhai
  • 成为java高级程序员需要掌握哪些

    精讲java
  • Java高级工程师需要掌握哪些核心点?

    每逢长假都会有很多程序员跳槽,十一、过年是跳槽黄金时刻,尤其是过年。过年的时候年终奖到手,没有了多少牵挂,年终同学同事聚会比较多,沟通的就多,各种工作机会的消息...

    程序员互动联盟
  • 开发者面试之JVM调优指南.mp4

    对于Java人来说,JVM无疑是进阶时必须迈过的坎。不管初入职场还是跳槽升职,JVM更是面试时的必考题。如果不懂JVM的话,薪酬会非常吃亏(近70%的面试者挂在...

    乔戈里
  • 慌了!面试官又拿JVM开怼!

    对于Java人来说,JVM无疑是进阶时必须迈过的坎。不管初入职场还是跳槽升职,JVM更是面试时的必考题。如果不懂JVM的话,薪酬会非常吃亏(近70%的面试者挂在...

    Java3y
  • 关于Jvm知识看这一篇就够了

    2016年左右的时候读了周志明《深入理解Java虚拟机:JVM高级特性与最佳实践》,读完之后受益匪浅,让我对Java虚拟机有了一个完整的认识,这是Jvm书籍中最...

    纯洁的微笑
  • 紧急应对金三银四跳槽季,那些想要换个场地的程序员可以在Android市场行动起来了!

    又要交房租了,工资怎么还不发?每个月总觉得钱不够花,工资总是跟不上消费,什么时候能涨个工资呢?

    Android技术干货分享
  • 谈谈中间件开发,给想从事中间件开发的同学

    随着国内软件行业的发展,国内互联网公司规模越来越大,业务越来越复杂,随之使用大量的中间件来提高后台服务性能。由此产生了中间件开发和维护人员。

    芋道源码
  • 十年高级程序员从阿里离职,分享这些年的面试经验——offer篇

    时隔两年再一次的面临离职找工作,这一次换工作有些许的不舍,也有些许的无奈。个人所在的技术团队不错,两年时间成长了很多,也很不舍这个团队。但是,由于公司的某些原因...

    用户4447430
  • 七年改变,如今年薪60W,分享这些年的经验总结!

    本人做Java开发的,第2年月薪7k(是不是很可伶),做金融风控相关项目,难听点,就是外包,每天增删改查,坐吃等死状态,每天就期待下班。但是心里总觉得这样下去要...

    美的让人心动
  • Java高级工程师面试总结

    面试技巧 1、背熟你的简历 原因:面试的第一个问题,一般都是让你简单介绍下你自己,或者介绍一下你最近的项目,而一个面试者,如果连自己的简历都无法熟知,对里面提到...

    Java高级架构
  • 【云+社区年度征文】详解JVM运行时数据区

    对于学过C++的开发者而言,他们对内存的分配与回收肯定不陌生,因为他们要对每一个对象负责(从创建到结束)。但是对于Java程序员来说,就不需要考虑那么多,因为虚...

    Simon郎
  • Android老司机教你如何快速突击大厂面试,快恶补这些知识点,成功必看!

    最近不少人在后台私信问我:做了几年 Android 工程师,现在很迷茫,想跳槽但是没有目标,不知道接下来该朝着哪个方向发展。

    Android技术干货分享
  • 以Java工程师为例,技术面试应该怎么准备?

    我自己的经验是,每个岗位的具体要求都不同,因此大家不要用一个通用的简历去应付所有的岗位,最好是根据特定公司的特定岗位来定制简历。当然这并不是让大家编故事,而是突...

    Java帮帮
  • BATM面试Java岗:精选200+面试题及答案、6大重点规划和经验总结

    金九银十已经结束了,而每到年后,总会有很多人跳槽。可我发现一个奇怪的现象:那些跳槽的人,总是从一个坑,跳进令一个坑中。毕竟一年过去了,会的还是原来的知识,人的身...

    用户6659115
  • 金三银四季,阿里工作10多年Java大牛的“心得”,献给迷茫中的你

    当你从事Java一年后,重新找工作时,才会真实的感受到“金三银四”这四个字背后的意思。

    秃顶的Java程序员

扫码关注云+社区

领取腾讯云代金券