Java # JVM内存管理

一、运行时数据区域

程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区、运行时常量池、直接内存

二、HotSpot虚拟机对象

  1. 对象创建:
    1. 引用检查
    2. 类加载检查
    3. 分配内存空间:指针碰撞、空闲列表
    4. 分配空间初始化
    5. 对象信息设置(对象头内)
  2. 对象内存布局:
    1. 对象头
    2. 实例数据
    3. 对象填充
  3. 对象访问定位:
    1. 句柄访问
    2. 直接指针访问
  4. OutOfMemoryError(OOM)
    1. 程序计数器不存在此问题
    2. Java堆溢出:
      1. 内存泄漏
      2. 内存溢出
    3. 虚拟机栈本地方法栈(HotSpot不区分)溢出
      1. StackOverFlowError:线程请求栈深度 > 虚拟机允许最大深度
      2. OutOfMemoryError:虚拟机栈内存允许动态拓展
      3. 可以通过减小最大堆和减小栈容量换取更多的线程
    4. 方法区和运行时常量区溢出
    5. 本机直接内存溢出:HeapDump无明显异常,可能原因:NIO间接使用DirectMemory
  5. 垃圾收集器与内存分配策略:对象回收
    1. 引用计数算法
    2. 可达性分析算法
    3. 引用:
      1. 强引用:Object object = new Object()存在引用赋值,永远不会回收被引用对象
      2. 软引用:还有引用但是非必须的对象,发生内存溢出异常前被二次回收,回收还不够才会报内存溢出异常
      3. 弱引用:非必须对象,生存到下一次垃圾回收为止
      4. 虚引用

你可能感兴趣的:(java,jvm,开发语言,八股文)