1 JVM 内存分哪几个区,每个区的作用是什么?

java 虚拟机主要分为以下几个区:

  1. 方法区:
    a. 有时候也成为永久代,在该区内很少发生垃圾回收,但是并不代表不发生 GC,在这里进行的 GC 主要是对方法区里的常量池和对类型的卸载
    b. 方法区主要用来存储已被虚拟机加载的类的信息、常量、静态变量和即时编译器编译后的代码等数据。
    c. 该区域是被线程共享的。
    d. 方法区里有一个运行时常量池,用于存放静态编译产生的字面量和符号引用。该常量池具有动态性,也就是说常量并不一定是编译时确定,运行时生成的常量也会存在这个常量池中。
  2. 虚拟机栈:
    a. 虚拟机栈也就是我们平常所称的栈内存,它为 java 方法服务,每个方法在执行的时候都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接和方法出口等信息。
    b. 虚拟机栈是线程私有的,它的生命周期与线程相同。
    c. 局部变量表里存储的是基本数据类型、returnAddress 类型(指向一条字节码指令的地址)和对象引用,这个对象引用有可能是指向对象起始地址的一个指针,也有可能是代表对象的句柄或者与对象相关联的位置。局部变量所需的内存空间在编译器间确定
    d. 操作数栈的作用主要用来存储运算结果以及运算的操作数,它不同于局部变量表通过索引来访问,而是压栈和出栈的方式
    e. 每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接.动态链接就是将常量池中的符号引用在运行期转化为直接引用。
  3. 本地方法栈:
    本地方法栈和虚拟机栈类似,只不过本地方法栈为 Native 方法服务。
  4. 堆:
    java 堆是所有线程所共享的一块内存,在虚拟机启动时创建,几乎所有的对象实例都在这里创建,因此该区域经常发生垃圾回收操作。
  5. 程序计数器:
    内存空间小,字节码解释器工作时通过改变这个计数值可以选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理和线程恢复等功能都需要依赖这个计数器完成。该内存区域是唯一一个 java 虚拟机规范没有规定任何 OOM 情况的区域。

2 Java 类加载过程?

Java 类加载需要经历一下几个过程:

  1. 加载
    加载是类加载的第一个过程,在这个阶段,将完成以下三件事情:
    a. 通过一个类的全限定名获取该类的二进制流
    b. 将该二进制流中的静态存储结构转化为方法运行时数据结构
    c. 在内存中生成该类的 Class 对象,作为该类的数据访问入口。
  2. 验证
    验证的目的是为了确保 Class 文件的字节流中的信息不会危害到虚拟机.在该阶段主要完成以下四种验证:
    a. 文件格式验证:验证字节流是否符合 Class 文件的规范,如主次版本号是否在当前虚拟
    机范围内,常量池中的常量是否有不被支持的类型.
    b. 元数据验证:对字节码描述的信息进行语义分析,如这个类是否有父类,是否集成了不
    被继承的类等。
    c. 字节码验证:是整个验证过程中最复杂的一个阶段,通过验证数据流和控制流的分析,确定程序语义是否正确,主要针对方法体的验证。如:方法中的类型转换是否正确,跳
    转指令是否正确等。
    d. 符号引用验证:这个动作在后面的解析过程中发生,主要是为了确保解析动作能正确执行。
    e. 准备
    准备阶段是为类的静态变量分配内存并将其初始化为默认值,这些内存都将在方法区中进行分配。准备阶段不分配类中的实例变量的内存,实例变量将会在对象实例化时随着对象一起分配在 Java 堆中。
  3. 解析
    该阶段主要完成符号引用到直接引用的转换动作。解析动作并不一定在初始化动作完成之前,也有可能在初始化之后。
  4. 初始化
    初始化是类加载的最后一步,前面的类加载过程,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由虚拟机主导和控制。到了初始化阶段,才真正开始执行类中定义的 Java 程序代码。

3 java 中垃圾收集的方法有哪些?

1 ) 引用计数法 应用于:微软的 COM/ActionScrip3/Python 等
a) 如果对象没有被引用,就会被回收,缺点:需要维护一个引用计算器
2 ) 复制算法 年轻代中使用的是 Minor GC,这种 GC 算法采用的是复制算法(Copying)
a) 效率高,缺点:需要内存容量大,比较耗内存
b) 使用在占空间比较小、刷新次数多的新生区
3 ) 标记清除 老年代一般是由标记清除或者是标记清除与标记整理的混合实现
a) 效率比较低,会产生碎片。
4 ) 标记压缩 老年代一般是由标记清除或者是标记清除与标记整理的混合实现
a) 效率低速度慢,需要移动对象,但不会产生碎片。
5 ) 标记清除压缩 标记清除-标记压缩的集合,多次 GC 后才 Compact
a) 使用于占空间大刷新次数少的养老区,是 3 4 的集合体

4 如何判断一个对象是否存活?( 或者 GC 对象的判定方法)

1.引用计数法:每个对象有一个引用计数器,被引用则加1,引用失效一次则减1,为0意味着垃圾对象,可被GC回收
2.可达性算法:该对象有无引用链接,GC Roots无法到达的对象则是垃圾回收的对象

5 什么是类加载器,类加载器有哪些?

实现通过类的权限定名获取该类的二进制字节流的代码块叫做类加载器。
主要有一下四种类加载器:

  1. 启动类加载器(Bootstrap ClassLoader)用来加载 java 核心类库,无法被 java 程序直接引用。
  2. 扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
  3. 系统类加载器(system class loader)也叫应用类加载器:它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader()来获取它。
  4. 用户自定义类加载器,通过继承 java.lang.ClassLoader 类的方式实现。

6 简述 Java 内存分配与回收策略以及 Minor GC 和 和 Major GC(full GC)

内存分配:

  1. 栈区:栈分为 java 虚拟机栈和本地方法栈
  2. 堆区:堆被所有线程共享区域,在虚拟机启动时创建,唯一目的存放对象实例。堆区是gc 的主要区域,通常情况下分为两个区块年轻代和年老代。更细一点年轻代又分为 Eden区,主要放新创建对象,From survivor 和 To survivor 保存 gc 后幸存下的对象,默认情况下各自占比 8:1:1。
  3. 方法区:被所有线程共享区域,用于存放已被虚拟机加载的类信息,常量,静态变量等数据。被 Java 虚拟机描述为堆的一个逻辑部分。习惯是也叫它永久代(permanment generation)
  4. 程序计数器:当前线程所执行的行号指示器。通过改变计数器的值来确定下一条指令,比如循环,分支,跳转,异常处理,线程恢复等都是依赖计数器来完成。线程私有的。

回收策略以及 Minor GC 和 和 Major GC: :

  1. 对象优先在堆的 Eden 区分配。
  2. 大对象直接进入老年代。
  3. 长期存活的对象将直接进入老年代。
    当 Eden 区没有足够的空间进行分配时,虚拟机会执行一次 Minor GC.Minor GC 通常发生在新生代的Eden区,在这个区的对象生存期短,往往发生GC的频率较高,回收速度快;FullGc/Major GC 发生在老年代,一般情况下,触发老年代 GC 的时候不会触发 Minor GC,但是通过配置,可以在 Full GC 之前进行一次 Minor GC 这样可以加快老年代的回收速度。

JVM的一些总结(面试须知)相关推荐

  1. python面试技巧和注意事项_Python 程序员面试须知须会的5个问题

    原标题:Python 程序员面试须知须会的5个问题 作为一个程序员,可能或多或少经历过一些技术面试,有些是编程语言本身的问题,有些是跟工程相关的问题.今天我们来总结关于Python程序员面试的时候经常 ...

  2. 不明白JVM虚拟机还怎么面试

    前言 说起MySQL优化的话,想必大部分人都不陌生了.在我们的记忆储备里也早已记住了这些关键词:避免使用SELECT*.避免使用NULL值的判断.根据需求适当的建立索引.优化MySQL参数-但是你对于 ...

  3. jvm类加载机制_面试:对于JVM类加载机制深度解析

    目录: 前文回顾 JVM在什么情况下会加载一个类? 从实用角度出发,来看看验证.准备和初始化的过程 核心阶段:初始化 类加载器和双亲委派机制 1.前文回顾 咱们今天先来回顾一下昨天讲到的JVM整体的一 ...

  4. 阿里 + 京东 Java 岗面试题概要(面试须知

    Zookeeper 做服务的注册中心,如果服务规模大于 1000,会发生羊群效应网络风暴,怎么优化? 分布式事务两阶段提交如果第二阶段超时了怎么办? 从源码角度讲一讲 Eureka 的底层架构与设计原 ...

  5. 阿里 + 京东 Java 岗面试题概要(面试须知)

    很多程序员都会担心 35 岁的职业危机,而数据也显示,40 岁以上的程序员几乎不存在,大都转了管理岗,余下的只能被迫离职或者转行.然而,太久待在舒适区,可能连小公司的面试,都很难通过了. 程序员是最需 ...

  6. 【对线面试】JVM全网最强面试对答

    文章目录 面试官: 今天我们来聊聊JVM吧!!! 面试官:那你先说一下 JVM 的内存区域有哪些? 面试官:很好,你刚刚提到永久代,那你知道永久代和元空间的区别吗 面试官:很不错,那我再问问,那你知道 ...

  7. 一文搞懂JVM架构:跳槽面试大厂被拒

    正文 在实际的工作项目中, 缓存成为高并发.高性能架构的关键组件 ,那么Redis为什么可以作为缓存使用呢?首先可以作为缓存的两个主要特征: 在分层系统中处于内存/CPU具有访问性能良好, 缓存数据饱 ...

  8. JVM垃圾回收,面试问到的都有了

    为什么我们在写Java程序的时候没有过多地去关注内存的分配和回收问题?因为JVM会帮助我们完成这两个工作,准确的说是JVM内存管理器来完成的.内存管理器(Memroy Collector)通常我们又叫 ...

  9. Java HashMap面试须知

    前言 HashMap作为Java面试中高频出现的面试题,是面试官们最喜欢问的问题之一,通常会出现在前3道技术面试题中,主要是为了筛选不会Java的候选人,亦或者是考察候选人平时会不会看JDK源码,下面 ...

最新文章

  1. 为什么OpenCV3在Python中导入名称是cv2
  2. 干货 | 应用性能提升 70%,探究 mPaaS 全链路压测的实现原理和实施路径
  3. [js] script所在的位置会影响首屏显示时间吗
  4. 小蒜的A+B 计蒜客 - T1283
  5. oracle的globalname后缀,在Oracle 11g下查看数据库的global_name
  6. shell脚本实现FTP自动上传文件
  7. [bzoj1510][POI2006]Kra-The Disks_暴力
  8. [node]request+watch开发自测的懒人神器
  9. HDU - 4567 Brilliant Programmers Show 2013长沙邀请赛
  10. ariang修改默认服务器,Mac小技巧之AriaNg Native配置
  11. C语言拯救者(程序的预处理、编译、链接与宏- -15)
  12. 基于ArcGIS:GIS空间分析复习-理论概念+案例分析
  13. 2022年河南省焊工高级技师理论知识模拟试题及答案
  14. 【现代简约风格装修案例】诠释不一样的简单 !
  15. 108颗佛珠的含义,每颗佛珠都有含义
  16. 【网页设计】HTML+CSS保护野生动物北极熊介绍网页设计专题
  17. 显色指数(CRI)计算软件分享
  18. 计算机教学在语文中应用,计算机在语文教学中的应用.doc
  19. 学习是为了完善人生,不是为了享受人生!
  20. RabbitMQ搭建集群时异常

热门文章

  1. linux pppd源码下载_LINUX下的拨号利器:wvdial和pppd —— 转载
  2. 城市精细化治理过程中的智能图像识别如何更精准、更智能?
  3. 古琴【A1】基本指法
  4. 用python画小仓鼠教程_小仓鼠简笔画教程
  5. 短视频优质作者必备|配音神器分享|那些你刷视频时肯定听过的声音
  6. 微信转发指定的图文消息到朋友圈(JAVA版)
  7. Android studio 常见问题(2)----存储空间不足导致AVD打不开的错误
  8. 微信小程序星星评分代码片段(含半星)
  9. 怎么把ofd转换成PDF文件?分享给你个好用的方法。
  10. Redis学习、缓存、持久化、哨兵模式