随笔分类 -  JVM

1
摘要:类加载器类加载器(ClassLoader)用来加载 class字节码到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源文件在经过 Javac之后就被转换成 Java 字节码文件(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class 类的一个实例。每一个这样的实例用来表示一个 Java 类。实际的情况可能更加复杂,比如 Java 字节代码可能是通过工具动态生成的,也可能是通过网络下载。类与类加载器类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远远不限于类加载阶段。对于任意一个类,都需要 阅读全文
posted @ 2012-11-25 20:26 ITA之路 阅读(424) 评论(0) 推荐(0)
摘要:类加载机制JVM把class文件加载的内存,并对数据进行校验、转换解析和初始化,最终形成JVM可以直接使用的Java类型的过程就是加载机制。类从被加载到虚拟机内存中开始,到卸载出内存为止,它的生命周期包括了:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸载(Unloading)七个阶段,其中验证、准备、解析三个部分统称链接。加载(装载)、验证、准备、初始化和卸载这五个阶段顺序是固定的,类的加载过程必须按照这种顺序开始,而解析阶段不一定;它在某些情况下可以在初始 阅读全文
posted @ 2012-11-25 20:24 ITA之路 阅读(193) 评论(0) 推荐(0)
摘要:JVM调优主要是针对内存管理方面的调优,包括控制各个代的大小,GC策略。由于GC开始垃圾回收时会挂起应用线程,严重影响了性能,调优的目是为了尽量降低GC所导致的应用线程暂停时间、 减少Full GC次数。代大小调优最关键参数:-Xms、-Xmx 、-Xmn 、-XX:SurvivorRatio、-XX:MaxTenuringThreshold、-XX:PermSize、-XX:MaxPermSize-Xms、-Xmx 通常设置为相同的值,避免运行时要不断扩展JVM内存,这个值决定了JVM heap所能使用的最大内存。-Xmn 决定了新生代空间的大小,新生代Eden、S0、S1三个区域的比率可以 阅读全文
posted @ 2012-10-20 12:39 ITA之路 阅读(244) 评论(0) 推荐(0)
摘要:无论是通过计数算法判断对象的引用数量,还是通过根搜索算法判断对象引用链是否可达,判定对象是否存活都与“引用”相关。引用主要分为 :强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(PhantomReference) 四种,引用的强度依次骤减。强引用:就是指在代码之中普遍存在的,类似:“Object objectRef = new Obejct”,这种引用,只要强引用还存在,永远不会被GC清理。软引用:用来描述一些还有用,但并非必须存在的对象,当Jvm内存不足时(内存溢出之前)会被回收,如果执行GC后,还是没有足够 阅读全文
posted @ 2012-10-19 17:54 ITA之路 阅读(258) 评论(0) 推荐(0)
摘要:1.JConsoleJConsole工具在JDK/bin目录下,启动JConsole后,将自动搜索本机运行的jvm进程,不需要jps命令来查询指定。双击其中一个jvm进程即可开始监控,也可使用“远程进程”来连接远程服务器。进入JConsole主界面,有“概述”、“内存”、“线程”、“类”、“VM摘要”和"Mbean"六个页签:内存页签相当于jstat命令,用于监视收集器管理的虚拟机内存(Java堆和永久代)变化趋势,还可在详细信息栏观察全部GC执行的时间及次数。线程页签最后一个常用页签,VM页签,可清楚的了解显示指定的JVM参数及堆信息。2.VisualVMVisualVM 阅读全文
posted @ 2012-10-09 22:21 ITA之路 阅读(238) 评论(0) 推荐(0)
摘要:查看JVM各个参数值方式1.HotSpot vm中的各个globals.hpp文件 查看jvm初始的默认值及参数globals.hppglobals_extension.hppc1_globals.hppc1_globals_linux.hppc1_globals_solaris.hppc1_globals_sparc.hppc1_globals_windows.hppc1_globals_x86.hppc2_globals.hppc2_globals_linux.hppc2_globals_solaris.hppc2_globals_sparc.hppc2_globals_windows.h 阅读全文
posted @ 2012-10-06 00:42 ITA之路 阅读(516) 评论(0) 推荐(0)
摘要:对象优先在Eden上分配大多数情况下,对象优先在新生代Eden区域中分配。当Eden内存区域没有足够的空间进行分配时,虚拟机将触发一次Minor GC(新生代GC)。Minor GC期间虚拟机将Eden区域的对象移动到其中一块Survivor区域。大对象直接进入老年代所谓大对象是指需要大量连续空间的对象。虚拟机提供了一个XX:PretenureSizeThreshold参数,令大于这个值的对象直接在老年代中分配。长期存活的对象将进入老年代虚拟机采用分代收集的思想管理内存,那内存回收时就必须能识别那些对象该放到新生代,那些该到老年代中。为了做到这点,虚拟机为每个对象定义了一个对象年龄Age,每经 阅读全文
posted @ 2012-10-06 00:41 ITA之路 阅读(190) 评论(0) 推荐(0)
摘要:HotSpot JVM收集器 上面有7中收集器,分为两块,上面为新生代收集器,下面是老年代收集器。如果两个收集器之间存在连线,就说明它们可以搭配使用。Serial(串行GC)收集器Serial收集器是一个新生代收集器,单线程执行,使用复制算法。它在进行垃圾收集时,必须暂停其他所有的工作线程(用户线程)。是Jvm client模式下默认的新生代收集器。对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。ParNew(并行GC)收集器ParNew收集器其实就是serial收集器的多线程版本,除了使用多条线程进行垃圾收集... 阅读全文
posted @ 2012-10-05 00:26 ITA之路 阅读(198) 评论(0) 推荐(0)
摘要:跟踪收集器跟踪收集器采用的为集中式的管理方式,全局记录对象之间的引用状态,执行时从一些列GC Roots的对象做为起点,从这些节点向下开始进行搜索所有的引用链,当一个对象到GC Roots 没有任何引用链时,则证明此对象是不可用的。下图中,对象Object6、Object7、Object8虽然互相引用,但他们的GC Roots是不可到达的,所以它们将会被判定为是可回收的对象。可作为GC Roots 的对象包括:虚拟机栈(栈帧中的本地变量表)中的引用对象。方法区中的类静态属性引用的对象方法区中的常量引用的对象本地方法栈中JNI的引用对象。主要有复制、标记清除、标记压缩三种实现算法。1. 标记 - 阅读全文
posted @ 2012-09-28 21:11 ITA之路 阅读(159) 评论(0) 推荐(0)
摘要:对象访问会涉及到Java栈、Java堆、方法区这三个内存区域。如下面这句代码:Object objectRef = new Object(); 假设这句代码出现在方法体中,"Object objectRef” 这部分将会反映到Java栈的本地变量中,作为一个reference类型数据出现。而“new Object()”这部分将会反映到Java堆中,形成一块存储Object类型所有实例数据值的结构化内存,根据具体类型以及虚拟机实现的对象内存布局的不同,这块内存的长度是不固定。另外,在java堆中还必须包括能查找到此对象类型数据(如对象类型、父类、实现的接口、方法等)的地址信息,这些数据 阅读全文
posted @ 2012-09-26 19:36 ITA之路 阅读(147) 评论(0) 推荐(0)
摘要:一:Java技术体系模块图二:JVM内存区域模型1.方法区也称"永久代” 、“非堆”, 它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。默认最小值为16MB,最大值为64MB,可以通过-XX:PermSize 和 -XX:MaxPermSize 参数限制方法区的大小。运行时常量池:是方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种符号引用,这部分内容将在类加载后放到方法区的运行时常量池中。2.虚拟机栈描述的是java 方法执行的内存模型:每个方法被执行的时候 都会创建一个“栈帧”用于存 阅读全文
posted @ 2012-09-24 23:57 ITA之路 阅读(159) 评论(0) 推荐(0)

1