jvm 结构:

  类加载子系统:从文件或者网络中加载class信息(classLoad)

  方法区:将加载的信息存放在方法区中,常量池,类变量

  java堆:虚拟机启动时创建,由jvm控制大小         【Eden,From , To】(young)【old】  【permanent】

  直接内存:运行NIO库下的东西

  垃圾回收系统:对象空间释放是隐式的。

  java栈:每一个java虚拟机线程都有一个私有的java栈

  本地方法栈:java栈用于java方法的调用,而本地方法栈用于本地方法调用

  pc寄存器:私有的,区分线程中执行方法是本地方法还是java方法

  执行引擎:负责执行虚拟机的字节码

jvm分代:为了提高垃圾回收的效率和内存的分配(如果不分代的话在垃圾回收时,会遍历所有的对象,效率不高)

  新生代:对象存活时间短。 只需要在新生代进行频繁的GC

  老年代:多次回收任然存活。 不需要频繁进行回收

  永久代:静态属性,类信息放在永久代中。 一般不进行回收,HotSpot特有的

垃圾回收算法:

  引用计数法:对象有一个引用,增加一个计数器,对象引用减少一个,计数器减一,缺点:无法处理循环引用的问题

  复制法:【主要用在survivor区即form和to之间的转换】,缺点:需要2倍的内存空间

  标记-清除法:分两个阶段,第一个阶段从引用根节点开始标记所有被引用的对象,第二阶段,遍历整个堆,把未被标记的对象清除,缺点,需要暂停整个应用,同时会产生内存碎片。

  标记-整理法:分两个阶段,第一个阶段从引用根节点开始标记所有被引用的对象,第二阶段,遍历整个堆,把清除未标记对象并且吧存活对象“压缩”到堆中的其中一块,按顺序排放

          此算法避免了“标记-清除”的碎片问题,同时避免了“复制”算法的空间问题。

 

垃圾收集器:是对垃圾回收算法的具体应用。

  次收集器(minor GC 又叫 Scavenge GC),在年轻代空间紧张时触发,总是优先于  --全收集器 (Full GC) System.gc() 触发的就是全收集器

 

分代回收器:7种

  young gereration : serial (串行收集器:只用一个cpu收集线程去完成GC工作) , parNew (并行收集器) , parallel  scavenge(并行)

  old  gereation又叫 tenured gereation: CMS(coucurrent Mark Sweep 并发 标记 清除 )  , serial old    ,  parallel old 

  第七个是处于年轻代和老年代之间的  G1(Gabage Frist)

  

  串行收集器 Serial :是HotSpot运行在client模式下默认的新生代收集器,且在进行垃圾回收时需要暂停所有的工作线程 stop the word,可以使用-xx+useSerialGC打开(这是一些指定虚拟机用什么GC),对串行收集器的优化就是减少暂停时间(这是一个矛盾的事情)。如果是新生代用的是复制算法,如果回收的是老年代用的是标记-整理算法

  jvm优化:1.合理的选择收集器

      2.选择jvm的版本(client和server)

      3.堆区大小的分配

  并行收集器 parNew:其实是serial的多线程版本.

  吞吐量=cpu运行用户的应用程序的时间/(cpu处理用户的程序的时间+GC所耗时的时间)

 

  

 

  获得到的垃圾收集器一定两个,一个是新生代的,一个是老年代的,可以通过eclipse中的运行修改参数。

  

posted on 2019-07-18 11:28  印记XP  阅读(175)  评论(0)    收藏  举报