JVM 50道面试题和答案.docx

preview
需积分: 0 0 下载量 168 浏览量 更新于2023-06-14 收藏 29KB DOCX 举报
**JVM内存分配与结构** 在Java中,对象主要在堆内存中分配,数组也是同样。如果对象在方法内部创建且没有逃逸出方法(即只在方法内部使用),那么根据JIT编译器的优化策略,这些对象可能会在栈上分配,以减少堆的压力。JVM内存分为以下几个区域: 1. **程序计数器(PC Register)**:每个线程都有自己的程序计数器,用于记录当前线程所执行的字节码指令地址。 2. **Java虚拟机栈(Java Virtual Machine Stacks)**:每个线程都拥有一个独立的虚拟机栈,用于存放栈帧,每个栈帧对应一个方法的调用。栈帧包含了局部变量表、操作数栈、动态连接、返回地址等信息。 3. **堆(Heap)**:Java对象的主要存储区域,进行垃圾收集的主要区域。JDK1.8以前,字符串常量池位于永久代,之后移到堆中。 4. **方法区(Method Area)**:存储类信息、常量、静态变量等,JDK8以前是永久代,之后是元空间(Metaspace)。元空间直接使用本地内存分配,不设置固定大小,避免了内存溢出问题。 5. **运行时常量池(Run-Time Constant Pool)**:方法区的一部分,包含类中constant_pool的内容,如字符串常量、符号引用等。 6. **本地方法栈(Native Method Stacks)**:为Java虚拟机执行native方法服务。 **JVM内存模型** JVM内存模型定义了一种统一的模型,将不同硬件和操作系统的内存访问差异抽象化。它分为两个主要部分:主内存(Main Memory)和工作内存(Thread Local Allocation Buffer, TLAB)。线程之间通过主内存交换信息,线程无法直接访问主内存,而是通过工作内存进行操作。工作内存中包含了线程的局部变量表、操作数栈、动态连接、返回地址等。 **垃圾收集与可达性分析** JVM使用可达性分析算法来确定垃圾对象,通过GC Roots(包括虚拟机栈、方法区、本地方法栈等中的引用)向下搜索引用链。如果一个对象无法与任何GC Root建立联系,就被认为是不可达的,进而被视为垃圾。软引用和弱引用会影响对象的回收时机,软引用在内存不足时会被回收,弱引用在每次垃圾收集时都会被回收。虚引用主要用于跟踪对象的回收活动,自身不会阻止对象的回收。 **JVM参数查看与调优** 查看JVM参数的默认值可以通过以下方式: 1. `jps -v`:列出JVM进程及其指定的参数。 2. 使用`-XX:+PrintFlagsFinal`启动JVM,可以看到所有参数的默认值。 3. `jinfo`命令可以实时查看和调整虚拟机参数。 JVM调优涉及到很多方面,包括内存分配、垃圾收集器的选择、线程池设置、编译优化等,需要根据应用的特点和性能需求进行细致的调整。
栾还是恋
  • 粉丝: 38
  • 资源: 5321
上传资源 快速赚钱
voice
center-task 前往需求广场,查看用户热搜

最新资源