Java岗位面试,JVM是对程序员基本功考察,通常会问你对JVM了解吗?
可以分几部分回答这个问题,首先JVM内存划分 | JVM垃圾回收的含义 | 有哪些GC算法 以及年轻代和老年代各自特点等等。1) JVM内存划分:
① 方法区 (线程共享) 常量 静态变量 JIT(即时编译器)编译后代码也在方法区存放
② 堆内存(线程共享) 垃圾回收的主要场地
③ 程序计数器 当前线程执行的字节码的位置指示器
④ Java虚拟机栈(栈内存) :保存局部变量,基本数据类型以及堆内存中对象的引用变量
⑤ 本地方法栈 (C栈):为JVM提供使用native方法的服务通过这幅图了解一下

JDK 1.8同JDK 1.7 最大的区别是:元数据取代了永久代.元空间的本质和永久代类似,都是对JVM规范中的方法区的实现.其元空间和永久代之间的最大区别在于:元数据空间不在虚拟机中,而是在本地内存中详细了解一下各个部分01)程序计数器(PC寄存器)
程序计数器的定义: 程序计数器是一块较小的内存空间,是当前线程正在执行的哪一条字节码指令的地址,若当前线程正在执行的是一个本地方法,那么此时程序计数器为Undefined

02)Java虚拟机栈
定义: 描述Java方法运行过程的内存模型
Java虚拟机栈会为每一个即将运行的Java方法创建一块叫做"栈帧"的区域,用于存放该方法运行过程中的一些信息,如 局部变量表 /操作数栈 /动态链接 /方法出口信息 .............

压栈出栈过程:
当方法运行过程中需要创建局部变量时,就将局部变量的值存入栈帧的局部变量表中
Java虚拟机栈的栈顶是当前正在执行的活动栈,也就是当前正在执行的方法,PC寄存器也会指向这个地址,只有这个活动的栈帧的本地变量可以被操作数栈操作,当前这个栈帧中调用另一个方法,与之对应的额栈帧又会被创建,新创建的栈帧压入栈顶,变成当前的活动栈帧,方法结束后,当前栈帧的返回值变成新的活动栈帧的中的操作数栈的一个操作数,如果没有返回值,那么新的活动栈帧中操作数栈的操作数没有变化
由于Java虚拟机栈是线程对应的,数据不是共享的,因此不用关心数据一致性问题,也不会存在同步锁的问题

特点:

03)本地方法栈(C栈)
定义: 是为了JVM运行native方法准备的空间,由于很多native方法都是用C语言实现的,所以通常又叫C栈,它与Java虚拟机栈实现的功能类似,只不过本地方法栈描述本地方法运行过程的内存模型栈帧变化过程:
本地方法被执行时,在本地方法栈也会创建一块栈帧,用于存放该方法的局部变量表 /操作数栈 /动态链接 /方法出口等信息; 方法结束后,相应的栈帧也会出栈,并释放内存空间.也会抛出StackOverFlowError和OutOfMemoryError异常04) 堆
定义: 堆是用来对象的内存空间,几乎所有的对象都存储在堆中特点:

05)方法区
定义: Java虚拟机规范中定义方法区是堆的一个逻辑部分,方法区存放以下信息 已被虚拟机加载的类信息 /常量 /静态变量 /即时编译后代码特点:

运行时常量池:
方法区中存放:类信息 常量 静态变量 即时编译器变编译后代码.常量就存放在运行时常量池中.当类被Java虚拟机加载后,.class文件中的常量就存在方法区的运行常量池,而且在运行期间,可以向常量池中添加新的常量,如String类的intern()方法就能在运行期间向常量池中添加字符串常量06) 直接内存(堆外内存)
直接内存是除Java虚拟机之外的内存,但有可能被Java使用操作直接内存:
在NIO中引入了一种基于通道和缓存的IO方式,他可以调用本地方法的直接分配Java虚拟机之外的内存,然后通过一个存储在堆中的DirectByteBuffer对象直接操作该内存,而无需将外部内存中数据复制到堆中再进行操作,从而提高数据操作的效率,直接内存的大小不受Java虚拟机,也会抛出OutOfMemoryError异常直接内存和堆内存比较:

2)类似 -Xms -Xmn这些参数的含义堆内存分配
① : JVM初始分配的内存由-Xms指定,默认是物理内存的1/64
②: JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4
③: 默认空余堆内存小于40%时,JVM就会增加堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制
④: 因此服务器一般设置-Xms -Xmx相等以避免在每次GC后调整堆大小. 对象的堆内存由成为垃圾回收器的自动内存管理系统回收非堆内存分配:
①:JVM使用-XX:PermSize 设置非堆内存的初始值,默认物理内存的1/64;
② :由XX:MaxPermSize设置设置最大非堆内存的大小
③: -Xmn2G :设置年轻代的大小为2G
④ :-XX:SurvivorRatio ,设置年轻代中Eden区与Survivor区的比值3)垃圾回收的算法有哪些?
① 引用计数法:原理是在此对象有个引用,即增加一个计数,删除一个引用则减少一个计数.垃圾回收时,只收集计数为0的对象.此算法的最致命的无法处理循环引用的问题
②: 标记-清除 :此算法分两个阶段,第一阶段从引用的根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除,此算法需要暂停应用,同时产生内存碎片
③: 复制算法 此算法把内存划分为两个相等的区域,每次只使用一个区域,垃圾回收时,遍历当前使用的区域,把正在使用的对象复制到另一个区域中每次算法每次只处理正在使用的对象,因此复制的成本比较小,同时复制过去以后还能进行相应的内存整理,不会出现"碎片问题",此算法的缺点也很明显,需要两倍的内存空间
④: 标记-整理:此算法结合了"标记-清除"和:复制算法的两个的优点,也是分两个阶段,第一个阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,清除未标记的对象并且把存活的对象"压缩"到堆的其中一块,按顺序排放,,此算法避免"标记-清除"的碎片问题,同时也避免"复制"的空间问题4)root搜索算法中,哪些可以作为root?

直接内存与元空间_深入浅出 JVM 内存管理相关推荐

  1. java jvm内存分配_JVM系列一:JVM内存组成及分配

    java内存组成介绍:堆(Heap)和非堆(Non-heap)内存 按照官方的说法:"Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在 Java 虚 ...

  2. jvm内存结构_聊聊JVM内存结构

    起因 我们经常会在面试的时候被问到JVM的内存结构,很多人会觉得这东西真的有用吗?也就是面试造火箭,入职拧螺丝.问这个就是纯粹来刁难人的吧. 但实际上,我们细想一下. •假设你不知道局部变量实际上属于 ...

  3. 深入浅出JVM内存模型+垃圾回收算法

    文章目录 前言 JVM内存模型 1. 程序计数器(记录当前线程) 2. Java栈(虚拟机栈) 3. 本地方法栈 4. 堆 5.方法区 6.直接内存 JVM垃圾回收 垃圾判断标准 1. 引用计数法 2 ...

  4. 线程基础知识_线程生命周期_从JVM内存结构看多线程下的共享资源

    线程生命周期 线程状态 New: 线程创建(new Thread()) Runnable: 线程可运行(thread.start()), 注: 调用start并不一定是运行状态, 可能在等待CPU调度 ...

  5. mfc强制局部区域刷新_简述JVM内存区域划分

    我们在Java编程时少不了程序优化,而程序优化的前提是知道JVM的内存是如何划分的,那么我们今天来大体了解下. 在看JVM内存区域划分之前,先来看一下Java程序具体执行的过程: 如上图所示,首先Ja ...

  6. java 内存 监控_监控JVM内存使用情况

    1.使用jstat命令查看堆内存的使用情况 jstat 命令选项 vmid 间隔时间 查询次数 1.查看当前进程Class类加载的统计 jstat -class ***** 2.查看编译统计 jsta ...

  7. java内存分析详解_深入java内存查看与分析详解

    1:gc日志输出在jvm启动参数中加入 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimestamps -XX:+PrintGCApplicationS ...

  8. 8g内存学习计算机专业够吗,现在电脑内存一般多大_现在电脑内存8个g够吗

    2016-12-13 13:45:12 现在主流的配置是1G,512M的也很多.电脑主板上一般都有两个内存插槽,也就是可以同时插两个内存条.一般的主板最大支持2G到4G的最大内存.超过这个数量,主板是 ...

  9. 查看jvm内存状态的方式 -NMT证明jvm内存多样性

    查看jvm内存状态的方式  1 图形化工具,如Jconsole.VisualVM 2 指令 jps jmap -heap/dump jstack 3 gc日志 4 NMT NMT详解 NMT特性可以用 ...

最新文章

  1. UI设计学习的对比原则怎么运用?
  2. 在sdk中添加源文件_实用干货 | 一步一步教你在SpringBoot中集成微信刷卡支付
  3. Spark平台上提交作业到集群生成的日志文件
  4. java mysql dao_Java DAO 模式
  5. 语音合成技术与资源 - 资源篇
  6. canal DevGuide
  7. layer自动补全 select
  8. Redhat6 网卡设置 IP地址及主机名配置
  9. C#中你可能不知道的8件事(zz)
  10. java工资高还是web前端工资高_java工资高还是php,java工资高还是web前端工资高,php和java学费...
  11. 关于流式计算和Excel的练习题
  12. 阿里云免费服务器ECS秒杀js脚本
  13. 华为账号不能连接服务器怎么回事,云服务器连接不了是什么原因_云服务器连不上是为什么_华为云...
  14. 【课堂笔记】模型制作流程
  15. 全球最大多物种水族馆将于5月23日向公众开放,容纳68000多只海洋动物 | 美通社头条...
  16. 字节、比特、位的单位换算
  17. 树莓派读取usb摄像头
  18. AndroidStudo格式化快捷键(Ctrl+alt+L)失效·解决方法
  19. 备战网络工程师认证考试:历年真题合集
  20. C/C++ 谈回调函数

热门文章

  1. Hbase 协处理器 RegionObserver
  2. 福建品品香茶业有限公司业务迁移上云
  3. Spring Cloud Gateway一次请求调用源码解析
  4. 阿里云CDN操控2.0版本正式发布
  5. 可用性SLA还不懂?看完这个故事就懂了
  6. 超18万人次下载使用的 Cloud Toolkit 的成长历程
  7. IoT SaaS加速器——助力阿尔茨海默病人护理
  8. 使用NGINX作为HTTPS正向代理服务器
  9. 深度揭秘“蚂蚁双链通”
  10. 云原生时代,开发者如何构筑容器安全?