【深入理解Java虚拟机】
Stranger。
一个正在减肥的胖子
展开
-
一、Java内存区域
Java内存区域包括Java堆、方法区、虚拟机栈、本地方法栈和程序计数器五部分。1、程序计数器 程序计数器是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器。在虚拟机中,可以通过改变计数器的值来选取下一条需要执行的字节码指令,程序中的分支、跳转、循环等都是需要依赖这个计数器来完成。 程序计数器是线程所私有的。2、Java虚拟机栈 Java原创 2016-11-21 16:24:53 · 231 阅读 · 0 评论 -
十、类加载过程
类加载的过程分为加载、连接(验证、准备、解析)和初始化三个步骤。1、加载 在加载阶段,虚拟机需要完成以下事情: ①通过一个类的权限定名来获取和定义此类的二进制字节流 ②将二进制字节流的静态存储结构转换为方法区的运行时数据结构 ③在Java堆中生成一个代表该类的Class对象,作为方法区数据的访问入口。2、连接 ⑴验证原创 2016-11-22 15:54:56 · 356 阅读 · 0 评论 -
九、内存分配规则
1、对象优先在Eden区分配原创 2016-11-22 14:33:10 · 383 阅读 · 0 评论 -
八、JDK的命令行工具
1、jps JVM Process Status Tool,用来显示指定的系统内所有的虚拟机进程。2、jstat JVM Statistics Monitoring Tool,用于收集虚拟机各方面的运行数据。3、jinfo Configuration Info for Java,显示虚拟机的配置信息。4、jmap Memory Map for Java原创 2016-11-22 14:25:56 · 286 阅读 · 0 评论 -
七、对方法区的回收
永久代的垃圾收集主要回收两部分内容:废弃常量和无用的类。1、废弃的常量 假如一个字符串已经进入常量池,若当前系统中没有任何一个String对象,也就是没有任何String对象引用该常量,并且在其他地方也没有引用这个字面量,那么它就可以被回收。2、无用的类无用的类需要同时满足以下三个条件: ①Java堆中不存在该类的任何实例 ②加载该类的ClassLoade原创 2016-11-22 11:50:19 · 707 阅读 · 0 评论 -
六、Java中的四种引用
1、强引用 类似于“Object obj = new Object();”这类的引用。表示只要引用存在,垃圾回收器就不会对其进行回收。我们一般创建的都是该类引用。2、软引用 该引用代表一些有用,但非必要的对象,在将要发生内存溢出时会对该类对象进行回收。可以用SoftReference类来实现。3、弱引用 该引用代表一些非必需的对象,强度必软引用低,被弱引用所关联的原创 2016-11-22 11:41:24 · 240 阅读 · 0 评论 -
五、对象的访问
1、句柄访问 Java堆中会划分一块内存作为句柄池,reference中存储的是对象的句柄地址,而句柄中包含了对象实例数据与对象类型数据的具体地址。 优势:reference中存储的是句柄地址,当对象被移动时只会改变句柄内的地址,reference中不会改变。2、直接指针访问 reference中直接存放对象地址。 优势:访问速度快,由于它节省原创 2016-11-22 11:19:57 · 363 阅读 · 0 评论 -
四、垃圾回收器
1.Serial 收集器 该收集器是一个单线程收集器,它的单线程不只是说只用一个CPU或一个回收线程去完成垃圾收集工作,更重要的是在它进行收集时,会暂停掉所有的用户线程,直到收集完成。2、ParNew 收集器 它是Serial收集器的多线程版本,除了使用多线程进行垃圾收集之外,其余行为都和Serial收集器一样。3、Parallel Scavenge 收集器 该收原创 2016-11-22 10:18:49 · 294 阅读 · 0 评论 -
三、GC算法
一、标记算法1、引用计数法 定义:为每一个对象添加一个计数器,当有地方引用该对象时,计数加1;当引用失效时,计数减1;当计数为0时,表示该对象可以被回收。 该算法比较简单,效率也很高,但是无法解决循环引用的问题。2、根搜索法 定义:通过被称为GC Roots的对象开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何一个引用链相连时,则原创 2016-11-21 17:26:34 · 325 阅读 · 0 评论 -
二、OutOfMemoryError内存溢出
1.Java堆溢出 Java堆溢出是实际应用中最常见的内存溢出异常情况。出现Java堆溢出时,异常堆栈信息“java.lang.OutOfMemoryError”后面会紧跟着进一步提示“java heap space”。 要解决这个区域的异常,一般的手段是首先通过内存映像分析工具对dump出来的堆转储快照进行分析,重点是确认是内存泄漏还是内存溢出。若是内存泄漏,可以进一步通过原创 2016-11-21 16:38:33 · 436 阅读 · 0 评论 -
十一、类加载器及双亲委派机制
1、启动类加载器(Bootstrap ClassLoader) 负责将存放在”Java_Home\lib”目录中的,或者被-Xbootclasspath 参数所指定的路径中的,并且是虚拟机识别的(仅按文件名识别)类库加载到虚拟机内存中。启动类加载器无法被Java程序直接使用。2、扩展类加载器(Extension ClassLoader) 这个加载器由sun.misc.Laun原创 2016-11-22 16:55:02 · 432 阅读 · 0 评论