深入理解Java虚拟机系列
文章平均质量分 77
该系列的文章是本人学习周志明大神的《深入理解Java虚拟机 JVM高级特性与最佳实践》之后的总结。看第一遍的时候没有写总结,因为看得挺吃力的,有许多地方存在疑问,担心写错了误人子弟。现在第三遍读此书,有自信能写一个不错的总结出来了。
Rainnnbow
这个作者很懒,什么都没留下…
展开
-
JVM的Server与Client运行模式区别与切换
JVM有两种运行模式Server与Client。两种模式的区别在于,Client模式启动速度较快,Server模式启动较慢;但是启动进入稳定期长期运行之后Server模式的程序运行速度比Client要快很多。这是因为Server模式启动的JVM采用的是重量级的虚拟机,对程序采用了更多的优化;而Client模式启动的JVM采用的是轻量级的虚拟机。所以Server启动慢,但稳定后速度比Client远原创 2016-08-17 10:45:30 · 5946 阅读 · 0 评论 -
Java对象的访问定位
java对象在访问的时候,我们需要通过java虚拟机栈的reference类型的数据去操作具体的对象。由于reference类型在java虚拟机规范中只规定了一个对象的引用,并没有定义这个这个引用应该通过那种方式去定位、访问java堆中的具体对象实例,所以一般的访问方式也是取决与java虚拟机的类型。目前主流的访问方式有通过句柄和直接指针两种方式。1.句柄访问 使用句柄访问方式,java堆将会划分原创 2016-08-08 13:01:16 · 1243 阅读 · 0 评论 -
Java对象的内存布局以及对象所需内存大小计算详解
1. 内存布局在HotSpot虚拟机中,对象的内存布局可以分为三部分:对象头(Header)、 实例数据(Instance Data)和对齐填充(Padding)。1) 对象头(Header):对象头又可以分为两部分: 第一部分用来存储对象自身的运行时基本数据信息。如哈希码、GC分代年龄、锁状态标示、线程持有的锁等。这部分数据的长度在32bit和64bit虚拟机上分别为32bit和64bit。官方原创 2016-08-08 12:45:06 · 1469 阅读 · 0 评论 -
Java对象的创建 —— new之后JVM都做了什么?
Java对象创建过程1. 类加载检查虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化过。如果没有则进行相应的类加载过程。(我之后会写一篇关于类加载顺序和过程的博客,并在此补充连接地址)2. 分配内存空间类加载检查通过之后,JVM将为新生对象在堆中分配内存。对象所需内存的大小在类加载完成后已经完全确定原创 2016-08-08 10:26:52 · 5238 阅读 · 0 评论 -
JVM三种垃圾收集算法思想及发展过程
JVM垃圾收集算法的具体实现有很多种,本文只是介绍实现这些垃圾收集算法的三种思想和发展过程。所有的垃圾收集算法的具体实现都是遵循着三种算法思想而实现的。1.标记-清除算法 标记-清除(Mark-Sweep)算法是最基础的垃圾收集算法。正如其名字描述的那样,该算法分为两个阶段:“标记”和“清除”。首先标记出所有可以被回收的对象,然后经过一轮垃圾回收将所有被标记的对象的内存空间释放,即清除可被回收的对原创 2016-02-18 11:18:06 · 1555 阅读 · 3 评论 -
JVM内存区域划分(JDK6/7/8中的变化)
前言Java程序的运行是通过Java虚拟机来实现的。通过类加载器将class字节码文件加载进JVM,然后根据预定的规则执行。Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些内存区域被统一叫做运行时数据区。Java运行时数据区大致可以划分为5个部分。如下图所示。在这里要特别指出,我们现在说的JVM内存划分是概念模型。具体到每个JVM的具体实现可能会有所不同。具原创 2016-01-19 10:57:44 · 7562 阅读 · 5 评论 -
Java继承时的初始化顺序
Java程序在启动和运行时,需要首先完成初始化的工作。在涉及到继承、static成员变量等因素时,初始化的顺序就复杂起来。下面以一个例子说明继承时的Java初始化顺序。例子:class Insect{ private int i = 9; protected int j; Insect(){ System.out.println("i = "原创 2015-10-22 11:14:48 · 1133 阅读 · 0 评论 -
String放入运行时常量池的时机与String.intern()方法解惑
运行时常量池概述Java运行时常量池中主要存放两大类常量:字面量和符号引用。字面量比较接近于Java语言层面的常量概念,如文本字符串、声明为final的常量值等。 而符号引用则属于编译原理方面的概念,包括了下面三类常量: - 类和接口的全限定名(包名+类名) - 字段的名称和描述符 - 方法的名称和描述符运行时常量池位置运行时常量池在JDK1.6及之前版本的JVM中是方法区的一部分原创 2016-01-05 11:28:40 · 4953 阅读 · 9 评论 -
String&StringBuilder&StringBuffer总结
一、String的JVM内存分配测试与分析 String a="a"; String b="b"; String c="ab"; String d="ab"; String e=a+b; String str1 = new String("ab"); String str原创 2015-06-03 08:39:48 · 880 阅读 · 0 评论