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中的运行修改参数。