● JAVA虚拟机
你是我世界的光
不念过往,不畏将来。
展开
-
JAVA运行时数据区域
java与C++之间有一堵由内存动态分配和垃圾回收技术所围成的“高墙”,里面的人想出去,外面的人想进来。 参考资料:《深入理解Java虚拟机:JVM高级特性与最佳实践》 周志明 著运行时数据区域根据《java虚拟机规范(java SE 7)》的规定,java虚拟机所管理的内存将会包括以下几个运行时数据区域。 1.程序计数器这是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示原创 2016-06-13 00:18:24 · 2367 阅读 · 1 评论 -
解释器与JIT编译器
本文转自http://book.51cto.com/art/201504/472756.htm早在Java1.0版本的时候,Sun公司发布了一款名为Sun Classic VM的Java虚拟机,它同时也是世界上第一款商用Java虚拟机,在当时这款虚拟机内部只提供解释器,用今天的眼光来看待必然是效率低下的,因为如果Java虚拟机只能够在运行时对代码采用逐行解释执行,程序的运行性能可想而知转载 2016-04-11 08:47:25 · 2269 阅读 · 0 评论 -
内存分配与回收策略
JAVA虚拟机的内存分配与分配策略本文参考《深入理解JAVA虚拟机》 周志明著 对象的内存分配,往大方向上讲,多数是在堆上分配,其中对象主要分配在Eden区,如果启动TLAB,将按照线程优先在TLAB上分配,但也有少数情况下会分配在老年区。1.对象优先在Eden分配首先介绍两种GC:①新生代GC,也叫Minor GC,指发生在新生代的垃圾回收动作,由于JAVA的大多数原创 2016-04-08 23:50:10 · 1182 阅读 · 0 评论 -
对象的创建、内存布局和访问定位
对象的创建1.虚拟机遇到一条new指令,首先检查该类是否加载,否则先执行类加载过程。2.类加载检查通过,虚拟机将会为对象分配内存,内存分配完毕,然后就进行一些必要的设置,例如这个对象是哪个类的实例,如何才能找到类的元数据信息,对象的哈希吗,对象的GC分代年龄信息等。这些信息放在对象的对象头中。执行init方法,把对象按照程序员的意愿进行初始化,至此,完整可用的对象完全产生。对象的内存布局对原创 2016-08-22 15:33:59 · 263 阅读 · 0 评论 -
GC的判定
对象是否死亡的2种判定方法,引用计数和可达性分析(又称引用链)。1.引用计数对象添加引用计数器,产生引用+1,引用失效-1,但是很难解决对象之间循环相互引用的问题。2.可达性分析算法选定一个对象作为GC Roots,如果一个对象对GC Roots不可达,那么就回收。作为GC Roots的对象包括下面几种:虚拟机栈中引用的对象。方法区类静态属性引用的对象。方法区中常量引用的对象。本地方法栈中引原创 2016-08-22 15:43:51 · 1351 阅读 · 0 评论 -
GC的三种收集方法
1.标记清除算法分为2个阶段,首先是标记阶段,对所有需要回收的对象进行标记,第二阶段是回收。主要不足:效率不高,空间产生碎片较多。2.复制算法将存活对象移到另一个独立的内存空间。3.标记整理对第一种方法的改进,代价高。上述几种算法可以综合使用。在新生代,如果对象在收集时经常会有很多死去,那么采用复制算法,只需要复制很少的对象即可。老年代,存活率较高,采用标记清除或标记整理。原创 2016-08-22 15:53:08 · 1229 阅读 · 0 评论 -
GC收集器
7种:1.serial收集器单线程,工作时必须暂停其他工作线程。多用于client机器上,使用复制算法2.ParNew收集器serial收集器的多线程版本,server模式下虚拟机首选的新生代收集器。复制算法3.Parallel Scavenge收集器复制算法,可控制吞吐量的收集器。吞吐量即有效运行时间。4.Serial Old收集器serial的老年代版本,使用整理算法。5.Parallel Ol原创 2016-08-22 16:09:51 · 1584 阅读 · 0 评论 -
类加载过程
五部分:加载、验证、准备、解析、初始化1.加载加载是类加载的第一个阶段,在加载阶段主要完成以下三件事情:通过类的全限定名来获取定义此类的二进制字节流。将这个字节流代表的静态存储结构转化为方法去的运行时数据结构内存中生成代表该类的Class对象,作为方法区这个类的各种数据的访问入口注意:对于HotSpot虚拟机而言,Class对象存储在方法区中,而不是堆中。2.验证根据class文件格式规范验原创 2016-08-22 23:32:12 · 609 阅读 · 0 评论 -
双亲委派模型
加载类的类加载器和这个类本身共同确定其在java虚拟机中的唯一性。从虚拟机的角度来看,一共存在2种不同的类加载器,一种是启动类加载器(Boostrap ClassLoader);这个加载器使用C++实现,是虚拟机的一部分。另一种是所有的其他类加载器。,独立于虚拟机外部,并且全部继承Java.lang.ClassLoader。从开发人员角度,存在:双亲委派模型来保证最基础的行为,比如Object类均委原创 2016-08-22 23:59:40 · 502 阅读 · 0 评论