首页 > 其他分享 >JVM八股

JVM八股

时间:2024-11-20 17:20:12浏览次数:1  
标签:八股 G1 收集器 回收 GC 内存 JVM 加载

JVM

JVM的内存结构

元空间,Java 虚拟机栈,本地方法栈(虚拟机栈执行Java方法,本地方法站执行native方法),程序计数器,堆内存,直接内存

JVM内存模型里的堆和栈有什么区别

栈主要用于存储局部变量、方法调用的参数、方法返回地址以及一些临时数据栈中的数据具有确定的生命周期,当一个方法调用结束时,其对应的栈帧就会被销毁,栈中存储的局部变量也会随之消失

栈中存的是对象引用

堆分为哪几部分

新生代(Young Generation),新生代分为Eden Space和Survivor Space
老年代(Old Generation/Tenured Generation
元空间(Metaspace)
大对象区(Large Object Space / Humongous Objects

方法区中的方法的执行过程

解析方法调用
栈帧创建
执行方法:
返回处理

对方法区(Method Area)存储内容描述如下:它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等

String 保存在字符串常量池中

内存泄露常见原因:

使用静态数据结构(如HashMap或ArrayList)存储对象,且未清理。
未取消对事件源的监听,导致对象持续被引用。
未停止的线程可能持有对象引用,无法被回收。

内存溢出常见原因:

大量对象创建:程序中不断创建大量对象,超出JVM堆的限制。
持久引用:大型数据结构(如缓存、集合等)长时间持有对象引用,导致内存累积。
递归调用:深度递归导致栈溢出

Java中创建对象的过程

类加载检查,分配内存,初始化零值,进行必要设置,比如对象头,执行 init 方法

类加载器

启动类加载器(Bootstrap Class Loader),扩展类加载器(Extension Class Loader),系统类加载器(System Class Loader)/ 应用程序类加载器(Application Class Loader),自定义类加载器(

Custom Class Loader)

双亲委派模型的作用

保证类的唯一性,保证安全性,支持隔离和层次划分,简化了加载流程

类加载过程

加载:通过类的全限定名(包名 + 类名),获取到该类的.class文件的二进制字节流,
连接:验证、准备、解析 3 个阶段统称为连接,验证字节码,准备静态字段,解析符号成直接引用
初始化
使用
卸载

引用计数法和可达性分析算法

GC Roots对象包括:虚拟机栈(栈帧中的本地变量表)中引用的对象、方法区中类静态属性引用的对象、本地方法栈中JNI(Java Native Interface)引用的对象,活跃线程的引用

垃圾回收算法有哪些?

标记-清除算法
复制算法:
标记-整理算法
分代回收算法

垃圾回收器有哪些

CMS(Concurrent Mark Sweep)收集器(标记-清除算法): 老年代并行收集器,以获取最短回收停顿时间为目标的收集器,具有高并发、低停顿的特点,追求最短GC回收停顿时间。
G1(Garbage First)收集器 (标记-整理算法): Java堆并行收集器,G1收集器是JDK1.7提供的一个新收集器,G1收集器基于“标记-整理”算法实现,也就是说不会产生内存碎片。此外,G1收集器不同于之前的收集器的一个重要特点是:G1回收的范围是整个Java堆(包括新生代,老年代),而前六种收集器回收的范围仅限于新生代或老年代

将GC分为三种类型:Minor GC(也称为Young GC)、Major GC(有时也称为Old GC)、以及Full GC

Minor GC (Young GC):只针对年轻代进行回收
major gc:主要针对老年代进行回收,但不一定只回收老年代
Full GC:对整个堆内存(包括年轻代、老年代以及永久代/元空间)进行回收。

垃圾回收器 CMS 和 G1的区别

CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用
CMS收集器以最小的停顿时间为目标的收集器
CMS收集器是使用“标记-清除”算法进行的垃圾回收,容易产生内存碎片
G1收集器使用的是“标记-整理”算法,进行了空间整合,没有内存空间碎片。

CMS适用场景:

低延迟需求,老生代收集,碎片化管理

G1适用场景

大堆内存,对内存碎片敏感,比较平衡的性能

JVM 的垃圾回收器不仅仅会对堆进行垃圾回收,它还会对方法区进行垃圾回收。

标签:八股,G1,收集器,回收,GC,内存,JVM,加载
From: https://www.cnblogs.com/nowiam/p/18558843

相关文章

  • 操作系统八股
    操作系统用户态和内核态内核态(KernelMode):CPU可以执行所有的指令和访问所有的硬件资源。有更高的权限用户态(UserMode):CPU只能执行部分指令集,无法直接访问硬件资源安全性,稳定性,隔离性线程和进程进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位线程组之间......
  • 并发编程八股
    并发编程保证数据的一致性事务管理,锁机制,版本控制线程的创建方式继承Thread类,重写其run()方法,调用start()方法启动线程实现Runnable接口,重写run()方法,调用start()方法启动线程实现Callable接口与FutureTask使用线程池(Executor框架)停止一个线程的运行异常法停止:线程......
  • 计网八股
    计网网络OSI模型和TCP/IP模型OSI网络模型主要有7层,分别是应用层、表示层、会话层、传输层、网络层、数据链路层以及物理层TCP模型应用层,传输层,网络层和网络接口层tcp在传输层ip在网络层HTTP、HTTPS、CDN、DNS、FTP都是应用层协议用同一个TCP连接来发送和接收多......
  • 【尼恩】JVM预热,你的方案是啥?
     转发自:https://blog.csdn.net/crazymakercircle/article/details/132793889尼恩老法师 说在前面在40岁老架构师尼恩的读者社区(50+)中,最近有小伙伴拿到了一线互联网Q企业如微博、阿里、汽车之家、极兔、有赞、希音、百度、网易、滴滴的面试资格,遇到一几个很重要的面试题:......
  • java高频面试题(八股文)
    基础/集合1.ArrayList/LinkedList有什么区别?1、数据结构: 在数据结构上,ArrayList 和 LinkedList 都是 “线性表”,都继承于 Java 的 List 接口。另外 LinkedList 还实现了 Java 的 Deque 接口,是基于链表的栈或队列,与之对应的是 ArrayDeque 基于数组的栈或队......
  • JVM 场景面试题【强烈推荐】
    前言:前面系列文章让我们对JVM及垃圾回收相关的知识有了一个基本的了解,JVM的知识比较偏概念,当然也有一些底层的源码可以去研读,但多数来说我们了解了JVM的原理即可,本篇我们将基于前面分享的JVM相关的原理知识,提取一些JVM中场景的面试题,希望可以帮助到有需要的朋友。......
  • jvm堆外内存
    jvm的内存包含堆内存和堆外内存,所谓堆内存就是我们平常用-xms和-xmx控制的内存,而堆外内存分为几部分:元空间大小:元空间是用于存储类的元数据信息的区域,在JDK8之后替代了永久代。可以通过-XX:MetaspaceSize和-XX:MaxMetaspaceSize来设置初始大小和最大大小。例如:-XX:MetaspaceS......
  • Java八股-Spring三级缓存,自动装配原理
    文章目录Spring的Bean生命周期Spring三级缓存循环依赖的解决过程结论Q&AQ:二级缓存是否是多余的?上面这个图只有一级缓存和三级缓存也能解决循环依赖,还能解决代理对象的问题了Q:光有一级缓存能不能解决@Autowire级别的循环依赖问题?Q:光有一级缓存和二级缓存,能不能解决@Aut......
  • JVM 内存分配的调优过程
    以一个创建1MB对象的接口来模拟万级并发请求产生大量对象的场景。@RequestMapping(value="/test1")publicStringtest1(HttpServletRequestrequest){List<Byte[]>temp=newArrayList<Byte[]>();Byte[]b=newByte[1024*1024];temp.add(b)......
  • 深入理解 JVM 垃圾回收算法
    前言上一篇我们对JVM的垃圾回收进行了探讨,知道了什么样的对象是垃圾对象,以及JVM虚拟机是如何判断一个对象垃圾对象的,本篇我们来探讨一下JVM垃圾回收算法。JVM系列文章传送门初识JVM(Java虚拟机)深入理解JVM(Java虚拟机)一文搞懂JVM垃圾回收(JVMGC)JVM有哪些垃......