PC、Java栈、本地方法栈随线程和方法的生命周期,因此内存分配与回收具有确定性。
Java堆和方法区只有在运行期间才能知道需要创建哪里对象,这部分内存分配和回收是动态的,GC关注这部分的内存。通过根追溯(Root Tracing)法,即一条引用链来判断对象存活,来确定是否回收对象(引用计数法不能解决对象相互引用等问题)。方法区主要回收废弃常量和无用的类。
垃圾回收算法:
一个虚拟机可以有多个不同的GC,如HotSpot就有7种作用于不同年代的GC,另外GC关注的线程数目(单线程还是多线程)也可能是不同的。
JVM试图定义一种内存模型来屏蔽各种硬件和操作系统间内存访问差异,以实现在各个平台都能达到一致的并发效果。
内存间的相互操作:
当一个变量被定义为volatile之后具备两种特效:可视性和禁止重排序。可视性的意思可以粗略理解为,虽然进行了原子操作,但是并不保证另外的线程看到的是最新修改后的值,可视性则保证最新值已经刷新到了主内存。重排序的意思是:不能保证变量赋值操作的顺序与代码的执行顺序一致,如果在本线程内观察,所有的操作都是有序的,即线程内有串行的语义;如果在一个线程观察另外一个线程,由于指令重排序,操作可能是无序的。
参考:
《深入理解Java虚拟机》
http://www.th7.cn/Program/java/201409/276272.shtml
原文地址:http://blog.csdn.net/leelit/article/details/46308951