深入理解java虚拟机

第一章 走进java:

         java技术体系: 1, java程序设计语言。 2, java虚拟机。3,Class文件格式。4,java API

         java技术体系分三个平台 :
                              JAVA ME(支持java运行在移动终端的平台)。
                              JAVA SE(支持面向桌面级应用的平台)。
                              JAVA EE(支持使用多层架构的企业应用的平台)

         java 发展始:

                  1991年4月, 由James Gosling博士领导的绿色计划开始启动, 目的是开发一种在各种消费性
                                           电子产品上运行的程序架构。这个产品就是java的前身:Oak(橡树)。

                  1995年5月23, Oak语言改名为java, 并发布1.0版本,口号:  Write once, Run Anywhere,
                                            JDK 1.5(老虎) JDK1.6(野马)  JDK1.7(海豚) 
                                            目前sun已经取得了三大商业虚拟机中的二个   JRockit 和 Hotspot

第二章 JAVA内存区域与内存溢出异常

          运行时数据区域

                         程序计数器:当前线程所执行的字节码的行号指示器。如果线程执行的

                                                 是JAVA方法,这个计数器所记录的是正在执行的虚拟机字节码指令的地址

                                                 如果线程执行的是native方法,这个计数器为空

                        Java虚拟机栈:线程私有的,与线程生命周期相同,用来存储局部变量表等等 (StackOverflowError和OutOfMemoryError)

                        本地方法栈:native方法服务 (StackOverflowError和OutOfMemoryError)

                         方法区: 各个线程

                         运行时常量池:是方法区的一部分。

                         java堆:分代收集算法。细分为:新生代(Eden, Fromsurvivor, ToSurvivor),老年代,持久代(OutOfMemoryError)

                         直接内存:(OutOfMemoryError)

 第三章 垃圾收集器

            无用的类:1,该类所有的实例都已经被回收, 也就是java堆中不存在该类的任何实例,

                                2,加载该类的ClassLoader已经被回收,

                                3,java.lang.Class对象没有在任何地方被引用

           判断对象已死的算法:

                                1,引用计数算法, 

                                       给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就会加1
         ,当引用失效时,计数器值就会减1, 任何时刻计数器都为0的对象就是不可能再被使用的
                                       缺点:   objA.instance=objB , objB.instance=objA, 这时这两个对象已经不可能再被访问
             ,导致引用计数都不为0

                                 2, 根搜索算法,

                                       通过一系列名为”GC Roots“的对象作为起始点,从这些节点开始向下搜索,
          搜索所走过的路径称为引用链(Reference Chain)  当一个对象到GCRoots
          滑任何引用链相连(图论:从GCRoots到这个对象不可达)时,则证明此对象是不可用的。

                                      GC Roots: 1, 虚拟机栈中引用的对象,2,方法区中的类静态属性引用的对象,
               3,方法区中的常量引用对象,4,本地方法栈中JNI的引用的对象

            垃圾收集算法:

                                1, 标记-清除算法(缺点:效率不高,空间碎片太多)

                                2,复制算法(将可用内存分成大小相等的两块每次只使用其中的一块,当这一块内存用完后
          ,就将还存活着的对象复制到另一块上面)IBM专门研究表明,新生代的对象98%都是早
          生夕死的,所以并不需要按照1:1的比例来划分内存空间,Hotspot虚拟机默认Eden和Survivor的比例为8:1.   
                             3,标记-整理算法(让所有存活的对象都向内存的一端移动,然后直接清理掉端边界的内存)
                             4, 分代收集算法 :新生代用 复制算法 , 老年代用”标记-清理“或者”标记-整理“的算法 。

           

              垃圾收集器:

                             Serial 收集器: (新生代)
                                             Stop the world:简单高效,在单个cpu的环境下面,Serial收集器没有线程交互的开销,可以获得很高的收集效率

                              ParNew收集器  (新生代)

           Series收集器的多线程版本 , 使用-XX:+UserConcMarkSweepGC选项后默认的新生代收集器,
                                            也可以用-XX:+UserParNewGC选项来强制指定他,  -XX:ParallelGCThreads参数来限制垃圾收集器的线程数。

                              目前只有上述两种收集器与 CMS收集器配合工作。

                              Parallel Scavenge收集器(新生代,吞吐量优先收集器:控制最大停顿时间 和吞吐量大小)
                              

                              Series Old收集器(老年代, 标记整理算法)
                              Parallel Old收集器(老年代,是Parallel Scavenge的老年代版本,注重吞吐量)

                               CMS收集器(Concurrent mark up, 标记-清除) 以获得最短回收停顿时间为目标的收集器。

                                 优点,多次标记。

                               G1收集器(jdk1.7)

第四章: 工具
               jstat   -gc    -gcutil输出已经使用空间占总空间的百分比

               jmap -dump:format=b,file={file} , pid。

               jconsole , visualvm

你可能感兴趣的:(java,算法,虚拟机,ClassLoader,parallel)