
JVM
2013302580255
这个作者很懒,什么都没留下…
展开
-
Understanding the JVM(一)运行时数据区域
JVM在执行Java代码时都会把内存分为几个部分,即数据区来使用,这些区域都拥有自己的用途,并随着JVM进程的启动或者用户线程的启动和结束建立和销毁。 程序计数器作用记录当前线程所执行到的字节码的行号。字节码解释器工作的时候就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。意义JVM的多线程是通过线程轮流切换并分配处理器执行时间来实现的,在任何一个确定的时刻,一个处理器或者多核处原创 2017-10-27 20:15:27 · 222 阅读 · 0 评论 -
Understanding the JVM(十)虚拟机类加载的过程
1. 加载在加载阶段(可以参考java.lang.ClassLoader的loadClass()方法),虚拟机需要完成以下3件事情: 1. 通过一个类的全限定名来获取定义此类的二进制字节流(并没有指明要从一个Class文件中获取,可以从其他渠道,譬如:网络、动态生成、数据库,从其他文件生成比如JSP等); 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构; 在内存中生成一个代表这个原创 2017-11-06 15:33:08 · 237 阅读 · 0 评论 -
Understanding the JVM(九)虚拟机类加载的时机
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中准备、验证、解析3个部分统称为连接(Linking)。 加载、验证、准备、初始化和卸载这5个阶段的顺序是确原创 2017-11-06 14:08:25 · 201 阅读 · 0 评论 -
Understanding the JVM(十二)虚拟机字节码执行引擎
java虚拟机的执行引擎:输入字节码文件(.class文件),通过解释执行或者编译执行进行字节码解析,输出执行结果。一 . 运行时栈帧结构=======栈帧是虚拟机栈的栈元素,栈帧存储了局部变量表,操作数栈,动态连接,和返回地址等。每一个方法的执行 对应的一个栈帧在虚拟机里面从如栈到出栈的过程。栈帧分配的内存在编译代码的时候已经确定了,不会受程序运行期变量的影响,仅仅取决于具体的虚拟机实现。原创 2017-11-20 15:14:03 · 257 阅读 · 0 评论 -
Understanding the JVM(八)垃圾收集器
HotSpot垃圾收集器新生代:Serial收集器它是一种单线程垃圾收集器 1. 使用一个CPU或者一条线程完成垃圾回收 2. 在进行垃圾回收时,必须暂停其他所有工作线程 stop the Word 3. 采取复制算法 4. client模式下默认的新生代收集器。对于限定单个CPU的环境来说,Serial收集器由于没有线程...原创 2017-10-31 10:47:21 · 266 阅读 · 0 评论 -
Understanding the JVM(七)HotSpot算法实现
枚举根节点可作为GC Roots的节点主要是全局性的引用与执行上下文中,如果要逐个检查引用,必然消耗时间。 另外可达性分析对执行时间的敏感还体现在GC停顿上,因为这项分析工作必须在一个能确保一致性的快照中进行——这里的“一致性”的意思是指整个分析期间整个系统执行系统看起来就行被冻结在某个时间点,不可以出现分析过程中对象引用关系还在不断变化的情况,该点不满足的话分析结果的准确性就无法得到保证...原创 2017-10-30 14:37:10 · 227 阅读 · 0 评论 -
Understanding the JVM(六)判断哪些内存需要回收
引用计数算法给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值加1;当引用失效时,计数器值减1.任何时刻计数器值为0的对象就是不可能再被使用的。 客观的说,引用计数器算法(Reference Counting)的实现简单,判定效率很高,在大部分情况下,都是一个不错的算法。但是,主流的Java 虚拟机里面没有选用引用计数算法来管理内存,其中最主要的原因是他很难解决u对象之间相互循环引...原创 2017-10-30 13:03:43 · 189 阅读 · 0 评论 -
Understanding the JVM(五)内存参数调优
java堆 -Xms and -Xmx (or: -XX:InitialHeapSize and -XX:MaxHeapSize) 指定JVM的初始和最大堆内存大小,Xms也可以理解为堆的最小值,两个值相等时java堆的大小确定。 java.lang.OutOfMemoryError:Java heap space 出现内存泄漏或者内存溢出。 通过设置-XX:+HeapDumpOnOutO原创 2017-10-28 16:04:24 · 139 阅读 · 0 评论 -
Understanding the JVM(四)对象的访问定位
在虚拟机栈中的局部变量表里面存有reference,通过reference数据来操作堆上的具体对象。对象具体的访问方式取决于虚拟机的实现。目前主流的访问方式有句柄和直接指针两种。句柄Java堆中划分出一块内存来作为句柄池,引用中存储对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息。简单理解就是指针的指针。 直接指针如果使用直接指针访问,那么Java堆对象的布局中就必须考虑如何原创 2017-10-28 14:35:54 · 201 阅读 · 0 评论 -
Understanding the JVM(三)对象的内存布局
对象头HotSpot虚拟机的对象头包括两部分信息:运行时数据和类型指针。 运行时数据 用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。官方称为“Mark word” 类型指针 即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。并不是所有的虚拟机实现都必须在对象数据上保留类型指针,换句话原创 2017-10-28 14:19:37 · 213 阅读 · 0 评论 -
Understanding the JVM(二)虚拟机对象的创建
对象创建类加载检查 遇到new指令时,先检查指令参数是否能在常量池中定位到一个类的符号引用: 1.如果能定位到,检查这个符号引用代表的类是否已被加载、解析和初始化过; 2.如果不能定位到,或没有检查到,就先执行相应的类加载过程;为对象分配内存 对象所需内存的大小在类加载完成后便完全确定(JVM可以通过普通Java对象的类元数据信息确定对象大小),为对象分配内存相当于把一块确定大小的内存从原创 2017-10-28 13:44:08 · 352 阅读 · 0 评论 -
Understanding the JVM(十一)虚拟机的类加载器
JVM设计者把类加载阶段中的“通过’类全名’来获取定义此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。类与类加载器类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远远不限于类的加载阶段。对于任意一个类,都需要由它的类加载器和这个类本身一同确定其在就Java虚拟机中的唯一性,每一个类加载器原创 2017-11-06 16:38:14 · 245 阅读 · 0 评论