[关闭]
@wxf 2018-03-10T11:19:07.000000Z 字数 1526 阅读 754

Java虚拟机相关问题整理

面试系列


JVM进程内存逻辑结构

JDK1.6-JDK1.7 JDK1.8
image_1c7o05h1km6111b4p1vu6ne5l.png-84.6kB image_1c7o647481g3b1uj4qilcr91qiu9.png-73.7kB

JVM内存区域结构

JDK1.6 JDK1.7 JDK1.8
image_1c7o0a26ruic1adb4cdhq4f0c12.png-104.2kB image_1c7o6j6mkdhqfqi1c17r1d1uebm.png-104.2kB image_1c7o6lgim1ilp6dq8dibcg1v9413.png-110.9kB

java栈:线程私有,每个方法在执行的同时都会创建一个栈帧用于存放局部变量等。局部变量表[1]存放了编译器可知的各种基本数据类型和对象引用。

本地方法栈:线程私有,和java栈类似,但是它是为Native方法服务的。

程序计数器:线程私有,当前线程所执行的字节码的指示器,用于记录下一条要运行的指令。

堆:线程共享,它是Java开发者需要重点关注的一块区域,因为它会涉及到内存的分配(new关键字,反射等)与回收(回收算法,收集器等)

方法区:线程共享,也叫永久区,在JDK1.6时方法区用于存储已被虚拟机加载的类信息、常量、静态变量等数据。在JDK1.7时常量被存储到堆中了,在JDK1.8时甚至没有了方法区,增加了元空间(本地内存)。

运行时常量池:运行时常量池是方法区的一部分(JDK1.6),用于存储编译器生成的各种字面量和符号引用。

Java内存溢出异常

image_1c7o36bvrhpb1neo1f6i1iq38pa1f.png-175.1kB

类加载器

类加载器的作用就是通过一个类的全限定类名来获取描述此类的二进制字节流

加载->检查->准备->解析->初始化->使用->卸载
JVM 类加载机制深入浅出

垃圾回收

在Java开发过程中,内存都是由虚拟机进行管理的,不管是申请内存还是释放内存都不需要程序员自己处理。但是如果在高并发情况下遇到了相应瓶颈时,我们就需要对程序进行优化其中垃圾回收就是一个重要关注点。那么下面我们主要探讨如下几个问题:
如何判断对象为垃圾对象
  - 引用计数法
  - 可达性分析法
如何回收垃圾对象
  - 回收策略
    - 标记-清除算法
    - 复制算法
    - 标记-整理算法
    - 分代收集算法
  - 垃圾回收器
    - serial
    - parnew
    - cms
    - g1
何时回收

在JDK1.8以后垃圾回收主要回收的是对内存,它是基于分代思想:
image_1c7oid5fr9tdthgefn1m8j1jk99.png-23.2kB
注意:在JDK1.6、JDK1.7中堆内存分为新生代、老年代和永久代(方法区)。

JVM垃圾回收算法
深入理解java垃圾回收算法


[1] Java局部变量表是栈帧重要组中部分之一。
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注