1.Java虚拟机运行时数据区:
方法区
-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根节点建立了引用链则将不会被回收.