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