JVM相关面试题及常用命令参数

JVM常用命令和参数

常用命令:
jps:查看进程及其相关信息
jmap:用来生成dump文件和查看堆相关的各类信息的命令
jstat:查看jvm运行时的状态信息
jstack:查看jvm线程快照的命令
jinfo:查看jvm参数和动态修改部分jvm参数

常用参数:
-Xms:初始化堆大小
-Xmx:最大堆大小
-Xmn:新生代的内存空间大小
-XX:SurvivorRatio
-Xss:每个线程的堆栈大小
-XX:PermSize:设置永久代初始值
-XX:MaxPerSize:设置永久代最大值

解释java堆空间及GC

当通过 Java 命令启动 Java 进程的时候,会为它分配内存。内存的一部分用于创建堆空间,当程序中创建对象的时候,就从堆空间中分配内存。GC 是 JVM 内部的一个进程,回收无效对象的内存用于将来的分配。

JVM主要组成部分及其作用

JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载)、Execution engine(执行引擎);两个组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。

作用 :首先通过编译器把 Java 代码转换成字节码,类加载器(ClassLoader)再把字节码加载到内存中,将其放在运行时数据区(Runtime data area)的方法区内,而字节码文件只是 JVM 的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),将字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用其他语言的本地库接口(Native Interface)来实现整个程序的功能。

Java 中堆和栈有什么区别?

JVM 中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而对象总是在堆上分配。栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享。

队列和栈是什么?有什么区别?

队列和栈都是被用来预存储数据的。

  • 操作的名称不同。队列的插入称为入队,队列的删除称为出队。栈的插入称为进栈,栈的删除称为出栈。
  • 可操作的方式不同。队列是在队尾入队,队头出队,即两边都可操作。而栈的进栈和出栈都是在栈顶进行的,无法对栈底直接进行操作。
  • 操作的方法不同。队列是先进先出(FIFO),即队列的修改是依先进先出的原则进行的。新来的成员总是加入队尾(不能从中间插入),每次离开的成员总是队列头上(不允许中途离队)。而栈为后进先出(LIFO),即每次删除(出栈)的总是当前栈中最新的元素,即最后插入(进栈)的元素,而最先插入的被放在栈的底部,要到最后才能删除。

简述Java垃圾回收机制

在java中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。在JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。

垃圾回收的优点和原理。并考虑2种回收机制

垃圾回收器通常作为一个单独的低级别的线程运行,在不可预知的情况下对内存堆中已经死亡的或很长时间没有用过的对象进行清除和回收。

程序员不能实时的对某个对象或所有对象调用垃圾回收器进行垃圾回收。

垃圾回收有复制垃圾回收、标记垃圾回收、增量垃圾回收。

有什么办法主动通知虚拟机进行垃圾回收?

可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。

说一下 JVM 有哪些垃圾回收算法?

  • 标记-清除算法:标记无用对象,然后进行清除回收。缺点:效率不高,无法清除垃圾碎片。
  • 复制算法:按照容量划分二个大小相等的内存区域,当一块用完的时候将活着的对象复制到另一块上,然后再把已使用的内存空间一次清理掉。缺点:内存使用率不高,只有原来的一半。
  • 标记-整理算法:标记无用对象,让所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存。
  • 分代算法:根据对象存活周期的不同将内存划分为几块,一般是新生代和老年代,新生代基本采用复制算法,老年代采用标记整理算法。

相关推荐

  1. JVM相关面试命令参数

    2024-03-11 23:56:03       45 阅读
  2. JVM参数

    2024-03-11 23:56:03       46 阅读
  3. JVM相关面试

    2024-03-11 23:56:03       42 阅读
  4. jvm调优参数命令总结

    2024-03-11 23:56:03       64 阅读
  5. 面试:linux的命令!!!

    2024-03-11 23:56:03       36 阅读
  6. JVM调优:JVM调优命令参数

    2024-03-11 23:56:03       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-11 23:56:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-11 23:56:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-11 23:56:03       82 阅读
  4. Python语言-面向对象

    2024-03-11 23:56:03       91 阅读

热门阅读

  1. 力扣代码学习日记七

    2024-03-11 23:56:03       43 阅读
  2. Latex 超长矩阵如何处理显示问题

    2024-03-11 23:56:03       58 阅读
  3. 如何避免前端请求明文传输

    2024-03-11 23:56:03       39 阅读
  4. ChatGPT写QT读写串口数据的Demo

    2024-03-11 23:56:03       42 阅读
  5. Qt区分左右Shift按键

    2024-03-11 23:56:03       46 阅读
  6. html打开方式

    2024-03-11 23:56:03       38 阅读
  7. [链表] 牛客题霸 - NC40 链表相加(二)

    2024-03-11 23:56:03       45 阅读
  8. 基础 | 安全 - [加密]

    2024-03-11 23:56:03       41 阅读