JVM的内存模型,主要分为五部分
1.程序计数器:内存中的一小块区域,主要用来指示当前线程执行的命令行,线程私有的,唯一一个没有异常的
2.java栈:主要存放局部变量、操作栈、动态链接、方法出口等信息,jvm执行方法的过程就是进栈出栈的过程,可能导致的异常为stackoverflowerror和outOfmemoryeror,线程私有的
3.本地方法栈:和java栈差不多,只不过一个是为java方法服务,而另外的一个是为native 方法服务,线程私有的
4.java堆:存放java对象的实例,也是垃圾回收的主要区域,其中GC堆分为:年轻代和老年代,年轻代又分为:eden、from survivor、to survivor,线程共享的,异常:outOfmemoryeror
5.java区,存放类的信息、静态变量、常量、即时编辑产生的代码。线程共享的,异常:outOfmemoryeror
具体参考:http://www.cnblogs.com/dingyingsi/p/3760447.html
java对象的引用方式:
1.硬引用:平时new出来的队形就是强引用,JVM即使是没有内存也不会去清除
2.软引用:当发生内存溢出的情况下,会清除
3.弱引用:即使内存不溢出,也可能会清除,当时不一定会一定清除
4.虚引用:随时都可能会被清除,它的清除必须要和引用队列一起。
具体参考:http://blog.csdn.net/coding_or_coded/article/details/6603549
垃圾回收机制:
垃圾回收主要有:
1.标记:对需要就行回收的对象进行标记,然后进行回收,优点:每次清理一小块区域,效率高,缺点;产生大量的碎片
2.复制,内存分为两个区域,一个分配对象,一个空闲,分配对象到一个内存区域,清理时,把所有的存活对象放到空闲的区域,另外的区域全部清理,
优点:不会产生磁盘碎片,缺点:效率低,浪费内存
3.标记—复制算法:前两者的结合
年轻带中eden区一般采用复制,而survivor中采用标记-复制,年老代采用标记算法
具体参考:http://www.cnblogs.com/ceshi2016/p/6077871.html
原文:http://www.cnblogs.com/grows/p/6097067.html