(一)jvm

jvm,作为java平台通用性的实现基础,重要性不言而喻。

1.开发新项目,写运行脚本时要运用相关知识,确定jvm参数

2.维护老项目,需要对jvm进行性能调优

 

jvm内存划分:

1.程序计数器

2.虚拟机栈,局部变量,操作数等。当方法需要的栈深度超过规定的最大深度,会报stackFlowOver异常

3.堆,对象分配

4.本地方法栈,native方法使用

5.方法区(包括运行常量池),常量,静态变量以及类的相关信息,Class对象(比较特殊)也在这里

6.直接内存,比如nio就会使用直接内存,减少了java堆和native堆之间来回复制数据

各区内存不足时会报出outOfMemory异常

 

垃圾收集策略

1.如何判断对象已死:

  • 引用计数器。缺点:循环引用,可能会现判断失误
  • 根引用是否可达。根引用的定义:虚拟机栈中的引用,方法区的常量引用和静态变量引用,native方法的引用

2.强 软 弱 虚引用的相关介绍见另一篇博文

 

垃圾回收算法

1.标记清除,cms收集器(用于老年代的垃圾回收)使用该算法。缺点在于容易产生碎片。

2.标记整理。缺点:开销大。

3.复制。缺点:因为要单独开辟区域用作复制,因此内存使用率下降。串行,并行收集器都使用该算法

4.分代,将堆内存分为新生代和老年代。不同代采用不同的垃圾回收算法。

 

垃圾收集器

1.串行收集器,单线程收集

2.并行收集器,多线程收集

3.并发收集器,垃圾回收与应用并行。

 

垃圾收集器有三大工作目标:

1.最大暂停时间目标,应用暂停期间,应用是无响应的,对高并发的web应用来说,应该尽可能减少暂停时间。—XX:MaxGCPauseMillis=<nnn> 可以指定最大暂停nnn毫秒。

2.吞吐量:吞吐量是应用垃圾收集以外的时间除以垃圾收集时间 -XX:GCTimeRatio=<nnn> 可以指定该比例

3.占用空间目标:当前两个目标达成后,垃圾收集器开始减少堆的大小

 

 

优化策略:

server模式的虚拟机,默认最大堆是内存的四分至一,最大不超过1G,如果需要更大堆,要明确指定

最大暂停时间和吞吐量两个目标是矛盾的,减小堆的大小,垃圾回收越频繁,每次暂停时间越短,总的垃圾收集时间会变大,吞吐量就会变小。

增大堆的大小,垃圾回收频率降低,总的垃圾回收时间变小,吞吐量变大,但是每次暂停时间会变大。

 

内存分代:

新生代:新生代又包括eden和两个survivor,新生代满了引发minor GC,minor GC当中,足够老的进入老年代(存活了若干代)

老年代:老年代满了之后,引发major GC,新生代和老年代都回收

—XX:+PrintGCDetails

-XX:+PrintGCTimeStamps

 

指定堆大小的参数 —Xmxn最大堆,—Xmsn最小堆

 

串行收集器可以通过—XX:MaxFreeHeapRatio=和—XX:MaxFreeHeapRatio=可以指定堆的可用空间大小,当可用空间小于min值时,扩大堆,大于max时,缩小堆。

 

新生代:—XX:NewRatio= 老年代除以新生代  —XX:NewSize= 和—XX:MaxNewSize=指定新生代初始和最大

—XX:SurvivorRatio=指定eden与单个survivor的比例 

多处理器要分配足够大的新生代,因为分配内存是并行的

 

垃圾收集器的选择:

串行:单处理器,小内存应用,:—XX:+UseSerialGC

并行:多处理器,—XX:+UseParalleGC,可以通过设置 —XX:+UseParalleOldGC,major GC时并行,minor GC串行,使用并行收集器,吞吐量大

并发:—XX:+UseG1GC —XX:+UseConcMarkSweepGC,垃圾回收与应用并发进行,只需要短暂停,牺牲了整体吞吐量,减小了响应时间。

 

posted @ 2016-12-10 01:06  swaggyC  阅读(195)  评论(0)    收藏  举报