Java虚拟机

2017-10-25  本文已影响4人  wayneinyz

1. Java内存区域

答:


Java虚拟机运行时数据区
(1) Java堆(线程共享)
(2) 方法区(线程共享)
运行时常量池
(3) Java虚拟机栈(线程私有)
(4) 本地方法栈(线程私有)
(5) 程序计数器(线程私有)

2. Java内存模型

Java 内存模型(Java Memory Model,JMM),用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果。

主要目标:定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。
注意:此处的变量与Java编程中所说的变量有所区别,它包括了实例字段、静态字段和构成数组对象的元素,但不包括局部变量与方法参数,因为后者是线程私有的,不会被共享,自然就不会存在竞争问题。

主内存与工作内存

Java 内存模型规定了所有的变量都存储在主内存(Main Memory)中。
每条线程还有自己的工作内存(Working Memory),线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量。
不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。
线程、工作内存、主内存三者的交互关系如下图所示:

线程、工作内存和主内存之间的交互关系

注意:
这里所讲的主内存、工作内存与前面所讲的 Java 内存区域中的 Java 堆、栈、方法区等并不是同一个层次的内存划分,两者基本上是没有关系的。

内存间交互操作

关于主内存与工作内存之间具体的交互协议,即一个变量如何从主内存拷贝到工作内存、如何从工作内存同步回主内存之类的实现细节,Java 内存模型中定义了以下8种操作来完成,虚拟机实现时必须保证下面提及的每一种操作都是原子的、不可再分的

Java 内存模型还规定了在执行上述8种基本操作时必须满足如下规则:

3. 类加载机制

定义

虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制

4. 如何判断一个对象是否存活?

在堆里面存放着 Java 世界中几乎所有的类实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象中哪些还“存活”着,哪些已经“死去”(即不可能再被任何途径使用的对象)。

(1) 引用计数算法

5. 垃圾收集算法

(1) 标记 - 清除算法
(2) 复制算法
(3) 标记 - 整理算法
(4) 分代收集算法

6. 垃圾收集器

(1) Serial 收集器
上一篇下一篇

猜你喜欢

热点阅读