java虚拟机常见配置及垃圾回收原理

1.Java虚拟机运行时数据区:

 

-Xms 堆初始内存 -Xmx 堆最大内存 各个线程共享的内存区域,垃圾回收主要区域 用于存放对象实例,并不是所有对象实例都存放在堆,逃逸分析技术,栈上分配,标量替换优化技术可以使一些对象实例直接在栈上存放 堆可分为 新生代,老年代

方法区

-XX:MaxPermSize 永久代最大内存

-XX:PermSize 永久代初始内存

各个线程共享的内存区域

它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据,java虚拟机堆的逻辑部分.

HotSpot使用永久带实现方法区,JDK1.6及之前常量池放在方法区

方法区无法满足内存分配需求时,将抛出OutOfMemoryError

虚拟机栈 -Xss  栈内存 线程私有 如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError 如果虚拟机栈可以动态扩展,且扩展时无法申请到足够的内存将抛出OOM
本地方法栈 线程私有 -Xoss 本地方法栈大小(使用HotSpot VM时此参数无效)

HotSpot 虚拟机栈与本地方法栈合二为一

与虚拟机栈一样,本地方法栈也会抛出StackOverflowError和OOM

程序计数器

线程私有

 无配置,程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器

唯一一个在java虚拟机规范中没有规定任何OOM情况的区域

 

2.垃圾回收

 

引用计数法

给对象添加一个引用计数器,每当有一个地方引用它时,计数器值加1,当引用失效时计数器值减1;任何时刻计数器值为0的对象就是不可能再被使用的.少数虚拟机使用此方法

优点:实现简单,判定效率高

缺点:难以解决对象间循环引用的问题

 

可达性分析法

通过一系列的GC根节点像下搜索,像下搜索的路径成为引用链,当一个对象到GC根节点没有任何引用链相互连接的时候,则证明此对象是不可用的.主流虚拟机多采用此方法

优点:解决了循环引用问题

缺点:效率不高,而且枚举根节点时整个系统处于冻结状态,会产生GC停顿(Sun称之为"Stop The World")

 

可达性分析算法中不可达的对象也不是一定会被回收,回收过程:不可达的对象会进行一次筛选(不满足筛选条件的对象将被回收):对象覆盖了finalize()且此方法没有被虚拟机调用过,筛选出来的对象会放入一个队列依次执行finalize(),如果执行finalize()时对象成功和GC根节点建立了引用链则将不会被回收.

 

 

 

 

猜你喜欢

转载自hgaong.iteye.com/blog/2410424