深入理解Java虚拟机 读书笔记

JVM内存结构

[img]http://dl2.iteye.com/upload/attachment/0104/7215/2f372909-8875-34d4-a352-9b73b0b526b7.png[/img]


1. 程序计数器:当前线程的字节码行号指示器。
2. Java虚拟机栈
描述Java方法执行的内存模型:每个方法执行时都会创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息。方法被调用直至执行完成对应着一个栈帧在虚拟机栈中从入栈到出栈的过程.
参数 –Xss
异常:StackOverFlowError OutOfMemoryError
3. 本地方法栈
为虚拟机调用本地方法服务。
异常:StackOverFlowError OutOfMemoryError
4. Java堆
存放对象实例,几乎所有的对象实例都在这里分配。是垃圾收集器管理的主要区域。细分为
a) 新生代:新生代又分为Eden空间 From Survivor空间和To Survivor空间 HotSpot虚拟机默认Eden和 Survivor的大小比例为8:1
新生代采用基于复制算法的垃圾回收机制,回收时,将Eden和Survivor中还存活的对象一次性拷贝到另一块Survivor空间上,最后一次清理掉Eden和刚才使用的Survivor空间,因为不能每次回收都只有不到10%的对象存活,当Survivor空间不够用时需要其他内存(老年代)进行分配担保。
b) 老年代:老年代垃圾回收基于“标记-整理算法”
c) Eden空间
d) From Survivor空间
e) To Survivor空间
参数:
-Xmx -Xms
-XX:+HeapDumpOnOutOfMemoryError
异常:OutOfMemoryError
5. 方法区
存储已被Java虚拟机加载的的类信息,常量、静态变量,即时编译器编译后的代码
参数:
-XX:PermSize
-XX:MaxPermSize
异常:OutOfMemoryError
6. 运行时常量池
方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。
异常:OutOfMemoryError
7. 直接内存
不是JVM运行时数据区域的一部分,也不是JVM规范中定义的内存区域。
参数:-XX:MaxDirectMemorySize(若不指定,默认与Java堆的最大值一样)
异常:OutOfMemoryError


垃圾收集器


[img]http://dl2.iteye.com/upload/attachment/0104/7217/628a5c06-94e9-33bc-bded-4911496d0184.png[/img]

1. Serial
Serial收集器是最基本,历史最悠久的垃圾收集器。这是一个单线程收集器,并且在它进行垃圾收集时,必须暂停其他所有的工作线程(Stop The World),直到它收集结束。对于限定单个C[U的环境来说,Serial由于没有线程交互的开销,具有最高的单线程收集效率,是虚拟机运行在Client模式下的默认收集器。
可用控制参数:
-XX:SurvivorRatio
-XX:PretenureSizeThreshold
-XX:HandlePromotionFailure
2. ParNew
Serial收集器的多线程版本。除了多线程以外与Serial收集器并没有太多创新之处,但它是运行在Server模式下的虚拟机中首选的新生代收集器。使用-XX:+UseConcMarkSweepGC选项后默认的新生代收集器,也可以使用-XX:UseParNewGC选项来强制使用。它默认开启的垃圾收集线程数与CPU的数量相同,可以通过-XX:ParallelGCThreads参数来限制垃圾收集的线程数。
3. Parallel Scavenge
使用复制算法的多线程新生代收集器。其他收集器关注尽可能地缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge的目标是达到一个可控制的吞吐量(运行用户代码时间/(运行用户代码时间+垃圾收集时间) )。停顿时间越短就越适合与用户交互的程序,而高吞吐量可以高效的利用CPU时间,尽快完成程序的运算任务,主要适合于在后台运行而不需要太多交互的任务。
参数:
-XX:MaxGCPauseMillis
-XX:GCTimeRatio
-XX:+UseAdaptiveSizePolicy(自适应调节参数,自适应调节策略也是Parallel Scavenge 与ParNew的一个重要区别)

4. Serial Old
Serial的老年代版本,主要意义也是被Client模式下的虚拟机使用。CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用。
5.Parallel Old
Parallel Scavenge的老年代版本。在注重吞吐量及CPU资源敏感的场合,都可以优先考虑Parallel Scavenge加Parallel Old收集器
5. CMS( Concurrent Mark Sweep )
以获取最短回收停顿时间为目标的收集器。CMS默认的回收线程数是(CPU数量+3)/4 .因为与用户线程并发,所以CMS无法处理浮动垃圾,也不能像其他收集器那样等老年代几乎被完全填满了再进行收集,需预留一部分空间提供并发收集时的程序使用。默认设置下,CMS收集器在老年代使用了68%的空间后被激活。
6. G1

内存分配与回收策略
Minor GC:发生在新生代的垃圾收集动作;
Major GC: 发生在老年代的垃圾收集动作,一般情况下需要Minor GC十倍的时间。
1. 对象优先在Eden空间分配,如果Eden没有足够的空间进行分配时,虚拟机将发起一次Minor GC;
2. 大对象(需要大量连续内存空间的Java对象)直接进入老年代。避免在Eden区和两个Survivor区之间发生大量的内存拷贝。
参数:-XX:PretenureSizeThreshold
3. 长期存活的对象将进入老年代.
参数:-XX:MaxTenuringThreshold
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值