JVM
文章平均质量分 70
王先生的副业
屌丝,爱做梦的屌丝。
展开
-
JVM(PART I)—Java内存
java虚拟机在执行java程序的过程中把它管理的内存分为不同的几个数据区域。运行时数据区:划分如图所示:1:程序计数器注:这是唯一一个不会有OutOfMemoryError的区域 项目 内容 特点 比较小的一块内存区域 作用 当前所执行的字节码的行号指示器,字节码解释器通过这个计数器的值来选取下一条要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依靠这原创 2017-09-29 13:48:47 · 265 阅读 · 0 评论 -
JVM (PART XII) Sun JDK 监控和故障处理工具(II)jstat
名称jstat(JVM Statistics Monitoring Tool),虚拟机统计信息监视工具功能显示本地或者远程虚拟机进程中的类装载、内存、垃圾回收、JIT编译等运行数据。格式jstat [ option vmid [interval[s|ms] [count]]]vmid 本地 远程虚拟机 lvmid [protocol:][//]lvmid[@hostname[:port原创 2017-10-11 13:18:37 · 261 阅读 · 0 评论 -
Java 多线程(PART VI) 线程状态图解
图解这是网上出现频率最高的一张图: 我用AI重新画了一遍(adobe illustrator 软件不错,但是我不太会用)。 主要有那么5种状态:新建状态:此时线程对象已经被创建,但是还是没有调用start()方法,如果调用run()方法线程不会启动。可执行状态:注:这是唯一可以进入running状态的状态,也叫就绪状态。 此时已经调用方法start(),JVM会为起创建方法调用栈和程序计数器,原创 2017-10-05 20:46:27 · 435 阅读 · 0 评论 -
JVM(PART XIX)Class文件(II)Class文件结构
介绍class文件采用一种类似C语言结构的伪结构来存储数据。这种伪结构只有两种数据类型:无符号数和表。 class文件没有分割符,所以每个单位的数量位置都有严格限制。 class文件是一组以8位字节为基本单位的二进制流,当需要占用8位以上字节的时候采用大端存储。无符号数 符号 含义 u1 1个字节 u2 2个字节 u4 4个字节 u8 8个字节无符号数字可原创 2017-11-07 09:36:43 · 192 阅读 · 0 评论 -
JVM(PART XX)Class文件(III)使用javap工具查看class文件
命令:javap -verbose xxx.class样例源码package hello;public class TestJava{ private int a=0; private String str="hello,world"; public TestJava(){ }}步骤:1:新建TestJava.java文件内容如上。 2:在工作目录下使用命令行j原创 2017-11-07 11:29:32 · 283 阅读 · 0 评论 -
JVM(PART XXI)各种指令
加载和存储指令 类型 指令 将一个局部变量加载到操作栈 iload,iload_< n>,lload,lload_< n>,fload,fload_< n>,dload,dload_< n>,aload,aload_< n> 将一个数值从操作数栈存储到局部变量表 istore,istroe_< n>,lstore,lstore_< n>,fstore,fstore_< n>,d原创 2017-11-09 11:24:42 · 632 阅读 · 0 评论 -
JVM(PART XXII)类的加载
类的生命周期包括7个阶段:加载(Loading)验证(Verification)准备(Preparation)解析(Resolution)初始化(Initialization)使用(Using)卸载(Unloading)发生的顺序:相互关系:验证,准备,解析三个步骤称为连接。 加载,验证,准备,初始化和卸载这5个步骤的顺序是确定的。 解析阶段有事可以在初始化阶段之后开始。 他们原创 2017-11-09 17:16:29 · 216 阅读 · 0 评论 -
JVM (PART XIII ) Class文件(I)魔数及相关
Class文件里的魔数 使用javac命令编译了java文件后,在工作目录文件夹下可以看到一个同名的.class文件, 使用winhex打开可以看到这个文件的内容, 可以看到前面四个字节(0,1,2,3)是0xCA,0xFE,0xBA,0xBE,连起来就是cafebabe,这就是Class文件的魔数, 第五和第六个字节(4,5)是0x00,0x00,这是class文件的次版本号, 第七和第原创 2017-10-16 17:08:25 · 259 阅读 · 0 评论 -
Java泛型擦除和泛型重载
泛型擦除什么是泛型在JDK1.5中添加了泛型的特性,它的本质是参数化类型的应用,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类,接口和方法的创建中,分别称为泛型类,泛型接口,和泛型方法java的泛型并不是真正的泛型在java和C#中都有泛型的应用,但是C#中的泛型是纯粹的泛型,java的泛型只存在于程序源码中,在字节码中已经被替换为原生类型,并且在相应的地方插入了强制转换代码,所以原创 2017-11-10 18:29:51 · 2618 阅读 · 0 评论 -
JVM (PART XI) Sun JDK 监控和故障处理工具(I)jps
Sun JDK 监控和故障处理工具 名 称 主要作用 jps JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机经常 jstat JVM Statistics Monitoring Tool,用于手机HotSpot虚拟机各个方面的运行数据 jinfo Configuration Info for Java,显示虚拟机配置原创 2017-10-10 22:07:23 · 539 阅读 · 0 评论 -
JVM (PART X) 内存分配图解
根据自己的理解画了一张内存分配图:原创 2017-10-03 13:36:57 · 374 阅读 · 0 评论 -
JVM(PART II)Eden Survivor名称由来
Eden:含义:伊甸园(The garden of Eden)Survivor:含义:幸存者GC:含义:Garbage CollectionStop the world event含义:地球停转事件,简称STW,即在执行垃圾收集算法时,Java应用程序的其他所有除了垃圾收集收集器线程之外的线程都被挂起为什么java的垃圾回收里会使用这几个名词来作为堆内存的名称呢?先来看看《创世纪》里的几个小故事:1原创 2017-09-29 20:04:36 · 1089 阅读 · 2 评论 -
JVM(PART III)对象的内存布局
在HotSpot虚拟机中,对象在内存中的布局可以分为3块区域:对象头(Header),实例数据(Instance Data)和对齐填充(Padding)。——《深入理解java虚拟机》布局:对象头:共包括两个部分: Tips:如果对象是一个Java数组,那么在对象头中还必须有一块用于记录数组长度的数据。(JVM可以通过普通java对象的元数据信息确定java对象的大小,但是从数组的元数据中无法得知原创 2017-09-30 19:22:12 · 268 阅读 · 0 评论 -
JVM (PART IV)对象的访问定位
我们可以使用栈上的reference来访问堆中的对象。如何访问有以下两种主流的方法,具体的方式取决于JVM的具体实现。句柄访问:如果使用句柄的访问方式的话,java堆中会开辟出一块内存作为句柄池。reference中保存的就是对象的句柄地址,句柄中包含了对象实例数据和类型数据的各自具体位置。如果是这种方式的话对象头(header)就不需要保存指向类型的指针。 优点:对象被移动时只会改变句柄中的原创 2017-09-30 19:50:54 · 248 阅读 · 0 评论 -
JVM (PART V)如何判断对象是否应该回收
再进行垃圾回收之前必须先判断对象是否还“存活”,如何判断对象是否“存活”?引用计数法做法: 给对象添加一个引用计数器,每当有一个地方引用他的时候,计数器加一,当引用失效的时候计数器减一。如果计数器的值为零则表示对象不可能再被使用。优点: 实现简单,判定效率高缺点: 无法解决对象间循环引用的问题对象的循环引用图解: 如果objA和objB都有字段instance并且 objA.insta原创 2017-10-01 13:49:47 · 299 阅读 · 0 评论 -
JVM (PART VI)垃圾收集算法
“标记-清除”算法标记 首先标记出要回收的对象(引用计数器为0或者引用链不可到达)。 清除 回收标记的对象。 不足: 1:清除和标记两个过程的效率都不高。 2:清除之后会产生大量不连续的空间碎片。导致后期经常执行GC操作。复制算法(用于新生代)做法: 将内存划分为大小相同的两个部分,每次只使用其中的一块,当一块内存用完了,就将还存活的对象复制到另一份上面。然后再把已经使用过的原创 2017-10-01 17:22:37 · 321 阅读 · 0 评论 -
JVM (PART VII)垃圾收集器的参数
参 数 描述 UseSerialGC 虚拟机运行在Client模式下的默认值,打开此开关后,使用Serial+Serial Old的收集器组合进行内存回收。 UseParNewGC 打开此开关之后,使用ParNew+Serial Old的收集器组合进行内存回收。 UseConcMarkSweepGC 打开此开关后,使用ParNew+CMS+Serial Old的收集器组合进原创 2017-10-01 20:52:16 · 233 阅读 · 0 评论 -
JVM (PART VIII)HotSpot的各种收集器和常见组合
安全点(Safepoint)一次GC操作是一次地球停转事件(Stop the world event)。这个时候所有的用户进程都会等待GC操作的完成。所以如何才能保证进入GC操作是安全的,SafePoint的选定既不能太少以至于让GC等待的时间太长,也不能过于频繁以至于过分增大运行时的负荷。 如何选取安全点: 安全点的选择以程序“是否具有让程序长时间执行的特征”为标准进行选定的。这些特征是:方法原创 2017-10-02 17:22:44 · 331 阅读 · 0 评论 -
JVM (PART IX) 内存分配与回收策略
前提:Serial/Serial Old 收集器组合,其他组合部分适用GC的分类新生代GC——Minor GC指的是发生在新生代的垃圾收集动作,因为Java对象的大多数都具备朝生夕灭的特点,所以Minor GC非常频繁,一般回收速度也比较快。老年代GC——Major GC(Full GC)指的是发生在老年代的GC,出现了Major GC,经常会伴随着至少一次的Minor GC(但非绝对的,在Para原创 2017-10-02 20:08:42 · 279 阅读 · 0 评论 -
JVM(PART XXIII)Java内存模型
内存之间的交互操作主内存和工作内存之间的具体交互协议,即一共变量如何从主内存拷贝到工作内存,如何从工作内存同步回到主内存的具体实现细节。java的内存模型一共定义了8中操作来完成。 虚拟机的实现必须保证这8种操作每一种都是原子的,不可再分的(对于double,long类型的变量来说,load,store,read,write操作在某些平台上允许有例外) 这八种操作分别是: lock,unloc原创 2017-11-11 18:09:27 · 230 阅读 · 0 评论