jvm原理
奔波儿灞爱上灞波儿奔
勤学如春起之苗,不见其长,日有所增。辍学如磨刀之石,不见其损,日有所亏。
展开
-
JVM 虚拟机栈详解
当Java虚拟机运行程序时。每当一个新的线程被创建时。Java 虚拟机都会分配一个虚拟机栈,Java虚拟机栈是以帧为单位来保存线程的运行状态。Java栈只会有两种操作:以帧为单位进行压栈跟出栈。 某个线程正在执行的方法称为当前方法,以此类推出当前类,当前常量池(每一个方法都有自己唯一的常量池) 每当线程调用当前方法时,都会将新栈压入,成为当前帧。jvm会使用它来存储我们的形参,局部变量,原创 2017-11-28 17:01:17 · 3141 阅读 · 0 评论 -
单分派,多分派
方法的接收者和方法的参数统称为方法的宗量。 根据分派基于宗量多少(接收者是一个宗量,参数是一个宗量),可以将分派分为单分派和多分派。单分派是指根据一个宗量就可以知道调用目标(即应该调用哪个方法),多分派需要根据多个宗量才能确定调用目标。如下代码:package diptch;public class DynamicDispatch { static class QQ {}原创 2018-01-10 19:46:14 · 574 阅读 · 0 评论 -
动态分派
与静态分派不同滴是,动态分派Java虚拟机是根据实际类型来分派方法执行版本。典型例子就是方法的重写。看代码:package diptch;public class DynamicDispatch { /** * * @author Administrator * */ static abstract class Huma原创 2018-01-10 17:34:26 · 258 阅读 · 0 评论 -
静态分派
Java面向对象的三个基本特征:继承,封装,多态,我们这次来看Java虚拟机如何实现,这里说的不是语法上的实现。 静态分派: 在Java语言中符合“编译期可知,运行期不可变”这个要求的方法,主要包括静态方法和私有方法两大类,前者与类型直接关联,后者在外部不可被访问,这两种方法各自的特点决定了他们不可能通过继承或别的方式重写其他版本,因此他们适合在类加载阶段进行解析。 静态方法、私有方法、实例原创 2018-01-10 16:55:39 · 161 阅读 · 0 评论 -
方法调用
方法调用过程是指确定被调用方法的版本(即调用哪一个方法),并不包括方法执行过程。我们知道,Class 文件的编译过程中并不包括传统编译中的连接步骤,一切方法调用在 Class 文件调用里面存储的都只是符号引用,而不是方法在实际运行时的内存布局入口地址,也就是说符号引用解析成直接引用的过程。这个特性使得Java 具有强大的动态扩展能力,但也使得 Java方法调用过程变得复杂起来,需要在类加载器件,甚原创 2018-01-10 22:42:44 · 224 阅读 · 0 评论 -
JVM运行时数据区域简介
jvm规范在运行java程序的过程会把它管理的区域分为若干区域(度娘图); 程序计数器(线程私有)*:* 是一块较小的内存空间,可以看做当前线程所执行的字节码行号的指示器;字节码解释器的作用就是通过改变计数器的值来选取下一条需要执行的指令,例如,循环,分支,跳转处理异常;都需要依赖这个计数器来完成。 Java虚拟机栈(线程私有): 每个方法在执行原创 2017-11-28 10:48:19 · 166 阅读 · 0 评论 -
JVM何时会进行全局GC
1、System.gc()方法的调用此方法的调用是建议JVM进行Full GC,虽然只是建议而非一定,但很多情况下它会触发 Full GC,从而增加Full GC的频率,也即增加了间歇性停顿的次数。强烈影响系建议能不使用此方法就别使用,让虚拟机自己去管理它的内存,可通过通过-XX:+ DisableExplicitGC来禁止RMI调用System.gc。2、老年代代空间不足老年代空间只有在新生代对象转载 2017-12-02 17:52:55 · 783 阅读 · 0 评论 -
JVM内存分配与回收策略
在基于Serial/Serial Old收集器(ParNew /Serial Old收集器组合基本也符合)下的的内存回收策略。对象优先分配在Eden区域: 在大多数情况下,新生代的对象在Eden区重分配,当Eden区域没有足够的空间分配时,虚拟机会进行一次Minor GC.V M参数:-verbose:gc -Xms200M -Xmx200M -Xmn100M -XX:+PrintG原创 2017-12-02 17:38:58 · 195 阅读 · 0 评论 -
Java 中Class文件详解
转自:JVM中class文件探索与解析一直想成为一名优秀的架构师的我,转眼已经工作快两年了,对于java内核了解甚少,闲来时间,看看JVM,吧自己的一些研究写下来供大家参考,有不对的地方请指正。 废话不多说,一起来看看JVM中类文件是如何加载和运行的。 (1)首先,编写简单代码,对其编译生成的class文件进行研究,其java代码如下: View Code 编译之后,用WinHex软件打开其clas转载 2017-12-01 17:46:49 · 769 阅读 · 0 评论 -
JVM垃圾收集器参数总结
参照深入JVM虚拟机原创 2017-12-01 22:23:38 · 162 阅读 · 0 评论 -
GC日志理解
阅读GC日志是处理Java虚拟机内存问题的基础技能,它只是一些人为确定的规则,没有太多技术含量。在本书的第1版中没有专门讲解如何阅读分析GC日志,为此作者收到许多读者来信,反映对此感到困惑,因此专门增加本节内容来讲解如何理解GC日志。 每一种收集器的日志形式都是由它们自身的实现所决定的,换而言之,每个收集器的日志格式都可以不一样。但虚拟机设计者为了方便用户阅读,将各个收集器的日志都维持一定的共性,原创 2017-12-01 17:39:36 · 140 阅读 · 0 评论 -
JVM垃圾收集器
垃圾回收算法是内存回收的方法论,而收集器是内存会说欧的具体实现,Java虚拟机规范中对垃圾回收器没有任何规定,不同厂商,不同版本的虚拟机都会有很大的差别。 下图是各种垃圾收集器的搭配使用的关系。 Serial收集器: Serial Garbage Collector: 算法:采用复制算法 内存区域:针对新生代设计 执行方式:单线程、串行原创 2017-12-01 17:20:59 · 192 阅读 · 0 评论 -
JVM client模式和Server模式的区别
这里向大家描述一下JVM client模式和Server模式两者的区别和联系,JVM如果不显式指定是-Server模式还是-client模式,JVM能够根据下列原则进行自动判断(适用于Java5版本或者Java以上版本)。JVM client模式和Server模式JVM Server模式与client模式启动,最主要的差别在于:-Server模式启动时,速度较慢,但是一旦运行起来后,性能将会有很大的转载 2017-12-01 13:22:56 · 2592 阅读 · 0 评论 -
Jvm 标记-清除法,复制算法,分代收集算法
标记-清除法: 最为基础的算法,“标记清除法”跟他的名字一样,算法分为两个阶段,”标记”阶段,跟”清除”阶段。说他是最基础打的算法,是因为后续的算法都是以他为基础而改进得到的, 他主要有两个不足:一是标记跟清除的效率都不高,另一方面,在回收之后会有大量的不连续空间碎片,这就会导致之后程序需分配大块连续的内存时,无法找到在足够的连续内存而不得不提前进行另一次的垃圾回原创 2017-12-01 09:33:12 · 3338 阅读 · 0 评论 -
Java堆内存垃圾回收机制(GC)详解 (引用计数法,根搜索法详解)
什么对象需要回收 在Java堆中存放着Java程序中新建的对象,也就是我们开发过程中 new,newarray 创建的对象。但没有明确的代码去释放他们。垃圾回收机制就是释放这些不再被程序所使用的对象的过程。为什么要使用垃圾收集器 在虚拟机的堆内存中,当某些对象失去引用,对于虚拟机内存而言就是”垃圾”,虚拟就就会回收这部分内存,以供后续的新对象使用。除了释放不在被引用的对象外,原创 2017-11-29 16:21:00 · 2962 阅读 · 0 评论 -
JVM如何优化
一、JVM内存模型及垃圾收集算法1.根据Java虚拟机规范,JVM将内存划分为:New(年轻代) Tenured(年老代) 永久代(Perm) 其中New和Tenured属于堆内存,堆内存会从JVM启动参数(-Xmx:3G)指定的内存中分配,Perm不属于堆内存,有虚拟机直接分配,但可以通过-XX:PermSize -XX:MaxPermSize 等参数调整其大小。年轻代(N...原创 2018-05-21 13:39:50 · 13477 阅读 · 8 评论