截图
简介
这是java虚拟机ppt,包括了简介,内存区域与内存溢出,垃圾回收,垃圾收集算法,垃圾收集器,调优演示,Q/A等内容,欢迎点击下载。
java虚拟机ppt是由红软PPT免费下载网推荐的一款课件PPT类型的PowerPoint.
Java虚拟机 简介 三大主流虚拟机 Sun HotSpot VM(Oracle) BEA JRockit VM (Oracle) IBM J9 VM 今天的主题针对Oracle公司的HotSpot虚拟机来展开的,JVM也是作为一个JAVA开发人员学习的核心知识,理解JVM的原理对以后的程序开发、生产故障分析、性能调优都有很大的帮助,同时也是走向资深猿的必修课。 运行时数据区包括程序计数器、虚拟机栈、本地方法栈、堆、方法区。运行时常量池(方法区)、直接内存(Native函数库直接分配堆外内存) 程序计数器 当前线程所执行的字节码行号指示器,即线程执行Java方法时,记录其正在执行的虚拟机字节码指令地址 通过执行线程行号记录,实现线程安全切换 线程私有,生命周期与线程相同 较小的内存空间,唯一在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域 Java虚拟机栈 每个方法被执行的时候创建一个栈帧,栈帧由三部分组成:局部变量区、操作数栈、动态连接。 单个线程栈内存大小可通过Jvm参数-Xss设定,影响栈的深度。 线程私有,生命周期与线程相同 两种异常状态:线程请求栈深度大于虚拟机允许的深度将抛出StackOverflowError,无法申请到足够的内存时会抛出OutOfMemoryError int a = 10; int b = 20; int c = a + b; 局部变量表 操作数栈 iload_1 iload_2 iadd istore_3 本地方法栈 与虚拟机栈类似,为虚拟机栈使用到的Native方法服务 Java堆(GC堆) 内存回收角度主要分为:Eden区、Survivor1(From)区、Survivor2(To)区;内存分配角度:多个线程私有的分配缓冲区(TLAB) 内存大小可通过Jvm参数控制 最小堆内存:-Xms 最大堆内存:-Xmx 新生代内存:-XX:NewSize Eden区与Survivor区比例:-XX:SurvivorRatio(默认8) 垃圾回收器:如,-XX:+UseSerialGC、 -XX:+UseParNewGC 、-XX:+UseConcMarkSweepGC、 -XX:+UseG1GC等 垃圾回收策略:-XX:MaxTenuringThreshold(默认15)、 线程公有 堆内存不足时会抛出OutOfMemoryError:Java heap space异常 方法区(非堆、永久代) 储存被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码等数据 Jdk1.8称metaspace,字面量、静态变量转移到Java堆 内存大小可通过Jvm参数控制 最小永久代内存:-XX:PermSize(默认物理内存的1/64)、-XX:MetaspaceSize(虚拟机动态调整) 最大永久带内存:-XX:MaxPermSize(默认物理内存的1/4) 、-XX:MaxMetaspaceSize (本地内存限制,虚拟机动态扩展) 内存不足时会抛出OutOfMemoryError:PermGen space异常 ,jdk1.8 OutOfMemoryError: Metaspace异常 字符串常量池,java.lang.String的intern()方法jdk1.7版本从实例拷贝改为引用 例子: String s1 = new StringBuffer("sc").append("ala").toString();System.out.println(s1.intern() == s1); String s3 = new StringBuffer("ja").append("va").toString();System.out.println(s3.intern() == s3); jdk1.6,false、false Jdk1.7,true、false 哪些内存需要回收? 什么时候回收? 如何回收? 如何判断对象已经死亡 引用计数算法 对象objA和objB都有字段instance,并赋值objA.instance=objB 及objB.instance=objA,示例代码如下: public void method(){ ObjectA objA = new ObjectA(); ObjectB objB = new ObjectB(); objA.instance = objB; objB.instance = objA; objA = null; objB = null; //此时虚拟机发起gc操作,objA和objB是否被回收?} 无法解决对象循环引用问题 可达性分析算法 当一个对象到GC Roots没有任何引用链相连时认为对象不可达,即对象死亡,下次垃圾回收来临时会对该对象做回收操作,但并不代表该对象一定会被回收。 可以作为GC Roots的对象 Class - 由系统类加载器(system class loader)加载的对象,这些类是不能够被回收的,他们可以以静态字段的方式保存持有其它对象。我们需要注意的一点就是,通过用户自定义的类加载器加载的类,除非相应的java.lang.Class实例以其它的某种(或多种)方式成为roots,否则它们并不是roots Thread - 活着的线程 Stack Local - Java方法的local变量或参数 JNI Local - JNI方法的local变量或参数 JNI Global - 全局JNI引用 Monitor Used - 用于同步的监控对象 Held by JVM - 用于JVM特殊目的由GC保留的对象,但实际上这个与JVM的实现是有关的。可能已知的一些类型是:系统类加载器、一些JVM知道的重要的异常类、一些用于处理异常的预分配对象以及一些自定义的类加载器等。 finalize()方法 可达性分析算法中的不可达对象也并非是“非死不可”的 垃圾收集算法 标记-清除算法(Mark-Sweep) 缺点:1.效率较低2.产生大量不连续的内存碎片 复制算法(Copying) 复制算法弥补了标记-清除算法中,内存布局混乱的缺点 缺点:1.浪费了一半的内存。 2.如果对象的存活率很高,我们可以极端一点,假设是100%存活,那么我们需要将所有对象都复制一遍,并将所有引用地址重置一遍。复制这一工作所花费的时间,在对象存活率达到一定程度时,将会变的不可忽视。 标记-整理算法(Mark-Compact) 标记过程和标记-清除算法一样,后续步骤不是将可回收对象进行清理,而是让所有存活对象都向一端移动,然后直接清理掉边界以外的内存,移动的对象内存地址被重置。 缺点:1.移动对象的同时需要修正指针,效率低 以上三种垃圾回收算法对比 分代收集算法 年轻代采用复制算法,年老代采用标记-清除、标记-整理算法 年轻代与年老代空间分配可通过虚拟机参数-XX:NewRatio,-XX:NewSize ,-XX:MaxNewSize,-Xmn调整,Eden区与Survivor区空间分配可通过虚拟机参数-XX:SurvivorRatio调整 垃圾收集器 -Xms750m -Xmx750m -Xmn250m -XX:MetaspaceSize=250m -Xverify:none -XX:+PrintGCDetails -Xloggc:D:/gc_idea.log -Xms750m -Xmx750m -Xmn350m -XX:MetaspaceSize=250m -Xverify:none -XX:+PrintGCDetails -Xloggc:D:/gc_idea.log Q/A 推荐书籍:深入理解Java虚拟机
展开