熟悉Java虚拟机的内存分区,理解 Java 内存模型

290 阅读3分钟

jvm内存空间分为:

方法区、java堆,java栈,本地方法栈,PC寄存器。

1、java虚拟机的组成部分:

java栈:存放java方法执行的所有数据

java堆:存放创建的对象

本地方法栈:存放native方法的所有数据C

方法区:存储jvm加载的类的信息,常量,静态变量

计数器:存储当前程序运行的指针信息。

2、堆内存:

分为新生代区(存放刚刚创建的对象)、老生代区(存放区的内存)。新生代区内存不足,会把部分对象放到老生代。当两部分对内存都不足会out of memory。分成两部分可以动态调整内存。

3、垃圾回收:

如何确认垃圾:

(1)引用计数法(无法识别相互引用的垃圾对象)

(2)可达性算法(jvm 1.3之后的算法)

垃圾清除算法:

(1)标记清除算法(内存碎片,不好分配内存)

(2)复制清除算法(需要额外空间来复制可达的对象)

(3)标记整理算法 (清除垃圾对象,修改引用指针移动对象)

分代收集算法:

java将内存分为几块,一般分为新生代和老生代。

新生代内存比较活跃,有大量的对象死去,只保留部分的对象存活,意味着只 需要付出少量的空间复制对象就可以完成回收,适合选择复制清除算法。 老生代由于对象存活率比较高,没有额外空间担保复制,适合选用表激情出发和标记整理法。

4、强引用、软引用、弱引用、虚引用

Object obj = new Object(); WeakRefrence wf = new WeakRefrence (obj); obj = null; 此时还有一个弱引用wf指向obj。

5、触发回收的方法

(1)不够内存了

(2)system.GC() //不是立刻触发内存

(3)低优先级GC的线程被执行

强引用: jvm宁愿抛出oom都不会回收他。

软引用: 如果内存足够久不回收,如果内存不足,就会回收它。适合用于内存敏感的高速缓存

弱引用: 弱引用的优先级比软引用更弱,只要GC线程扫描到,就会立刻回收它。但是GC线程是优先级很弱的线程,所以,不一定会立刻发现它。

虚引用: 在任何时候都有可能被垃圾回收掉,主要用于跟踪对象被垃圾回收的活动。主要和队列一起使用,在回收该对象之前会先把该对象的虚引用加入队列,可以通过队列中是否加入了虚引用来判断队列是否将要被回收了。 blog.csdn.net/junjunba268…

Java 内存模型:

 java内存模型称为jmm,是一种java虚拟机保证数据一致性的规范的模型,为了解决多线程通过共享内存通信导致的数据不一致的问题。

 jmm规定了所有的变量都保存在主内存中,每个线程有自己的本地内存,本地内存保存着局部变量和从主内存中拷贝的副本。线程不能直接操作主内存,只能操作本地内存中的副本,然后同步到主内存中。线程之间需要通信的话需要先更改本地内存副本,然后同步到主内存中,然后另一个线程从主内存中读取数据。