随笔分类 -  深入理解Java虚拟机

摘要:首先,什么是类的加载?类的加载由类加载器执行.该步骤将查找字节码(classpath指定目录),并从这些字节码中创建一个Class对象。Java虚拟机为每种类型管理一个独一无二的Class对象。也就是说,每个类(型)都有一个Class对象。一旦某个类的Class对象被载入到内存,他就被用来创建这个类 阅读全文
posted @ 2017-08-12 10:37 竹马今安在 阅读(5265) 评论(1) 推荐(1) 编辑
摘要:前面的几篇都没有太明确地指出 方法区 是什么?现在通过一些资料的收集和学习,下面做一些总结 什么是方法区: 方法区是系统分配的一个内存逻辑区域,是JVM在装载类文件时,用于存储类型信息的(类的描述信息)。 方法区存放的信息包括: 类的基本信息: 1.每个类的全限定名 2.每个类的直接超类的全限定名( 阅读全文
posted @ 2017-08-12 10:32 竹马今安在 阅读(3264) 评论(1) 推荐(0) 编辑
摘要:类加载过程: 1, JVM会先去方法区中找有没有相应类的.class存在。如果有,就直接使用;如果没有,则把相关类的.class加载到方法区 2, 在.class加载到方法区时,会分为两部分加载:先加载非静态内容,再加载静态内容 3, 加载非静态内容:把.class中的所有非静态内容加载到方法区下的 阅读全文
posted @ 2017-08-12 10:22 竹马今安在 阅读(821) 评论(0) 推荐(0) 编辑
摘要:JVM 内存分配模型概念 --在工作中可能用到的机会不多,有个概念的了解 --此文是转载某位读者,应该是在阅读了《深入理解Java虚拟机JVM高级特性与最佳实践》 一书后,总结所得。写的不错,转载哈 一、JVM内存区域划分 大多数 JVM 将内存区域划分为 Method Area(Non-Heap) 阅读全文
posted @ 2017-08-12 10:15 竹马今安在 阅读(670) 评论(0) 推荐(0) 编辑
摘要:本文主要内容: Trace跟踪参数 堆的分配参数 栈的分配参数 零、在IDE的后台打印GC日志: 既然学习JVM,阅读GC日志是处理Java虚拟机内存问题的基础技能,它只是一些人为确定的规则,没有太多技术含量。 既然如此,那么在IDE的控制台打印GC日志是必不可少的了。现在就告诉你怎么打印。 (1) 阅读全文
posted @ 2017-08-06 09:54 竹马今安在 阅读(512) 评论(0) 推荐(0) 编辑
摘要:面向过程的编程思想: 程序编写都是以算法为核心的,程序员会把数据和过程分别作为独立的部分来考虑,数据代表问题空间中的客体,程序代码则用于处理这些数据,这种思维方式直接站在计算机的角度去抽象问题和解决问题 面向对象的编程思想: 站在现实世界的角度去抽象和解决问题,把数据和行为都看做是对象的一部分,这样 阅读全文
posted @ 2017-08-05 16:51 竹马今安在 阅读(289) 评论(0) 推荐(0) 编辑
摘要:Java的并发采用的是共享内存模型(而非消息传递模型),线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。多个线程之间是不能直接传递数据交互的,它们之间的交互只能通过共享变量来实现 同步是显式进行的。程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行。 1、多线程 阅读全文
posted @ 2017-08-05 10:21 竹马今安在 阅读(282) 评论(0) 推荐(0) 编辑
摘要:1.硬件的效率与一致性 由于计算机的存储设备与处理器的运算速度有几个数量级的差别,而绝大多数的运算任务都要与内存交互,所以现代计算机系统不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存来作为内存与处理器之间的缓冲:将运算需要使用到的数据复制到缓冲之中,让运算能快速进行,当运算结束后再从缓存同 阅读全文
posted @ 2017-08-05 10:18 竹马今安在 阅读(218) 评论(0) 推荐(0) 编辑
摘要:最初java程序是通过解释器进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”。为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器! 即时编译器并不是虚拟机必须的 阅读全文
posted @ 2017-08-04 17:07 竹马今安在 阅读(329) 评论(0) 推荐(0) 编辑
摘要:1.泛型与类型擦除 泛型的本质是参数化类型的应用,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口和泛型方法。在泛型没有出现之前,只能通过Object是所有类型的父类和类型强制转换两个特点的配合来实现类型泛化,由于java语言所有的类型都 阅读全文
posted @ 2017-08-03 17:22 竹马今安在 阅读(275) 评论(0) 推荐(0) 编辑
摘要:java语言的“编译期”其实是一段“不确定”的操作过程,可能是指一个前端编译器把.java变成.class的过程,也可能是指虚拟机的后端运行期编译器(JLT)把字节码转变成机器码的过程,也有可能是使用静态提前编译器(AOT)直接把.java文件直接编译成本地机器代码的过程。现在讨论的是第一种编译器。 阅读全文
posted @ 2017-08-03 12:41 竹马今安在 阅读(237) 评论(0) 推荐(0) 编辑
摘要:虚拟机调用方法可以有解析和分派两种方式,那么虚拟机是如何执行方法中的字节码指令的? 1.解释执行 谈是解释执行还是翻译执行没有意义了,只有确定了某种具体的java实现版本和执行引擎运行模式时,谈解释执行还是编译执行才比较贴切。 如今,基于物理机、java虚拟机,或者非Java的其他高级语言虚拟机的语 阅读全文
posted @ 2017-08-03 10:31 竹马今安在 阅读(305) 评论(0) 推荐(0) 编辑
摘要:方法调用阶段唯一的任务就是确定被调用方法的版本(调用的是哪一个方法),暂时还不涉及方法内部的具体运行过程。Class文件的编译过程中 不包含传统编译过程中的“连接”,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址。这给java带来更强的动态扩展功能的 阅读全文
posted @ 2017-07-31 18:01 竹马今安在 阅读(551) 评论(0) 推荐(0) 编辑
摘要:执行引擎是java虚拟机最核心的组成部分之一。在java虚拟机中制定了虚拟机字节码执行引擎的概念模型,这个概念模型成了各种虚拟机执行引擎的统一外观。在不同的虚拟机实现里面,执行引擎可能会有解释执行和编译执行两种选择,也可能两者兼备,甚至还可能会包含几个不同级别的编译器执行引擎,但是从外观上看起来,所 阅读全文
posted @ 2017-07-31 11:11 竹马今安在 阅读(329) 评论(0) 推荐(0) 编辑
摘要:ClassLoader翻译过来就是类加载器,普通的Java开发者其实用到的不多,但对于某些框架开发者来说却非常常见。理解ClassLoader的加载机制,也有利于我们编写出更高效的代码。ClassLoader的具体作用就是将class文件加载到jvm虚拟机中去,程序就可以正确运行了。但是,jvm启动 阅读全文
posted @ 2017-07-30 18:08 竹马今安在 阅读(510) 评论(0) 推荐(0) 编辑
摘要:准备阶段的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到了Java虚拟机外部去实现,以便让应用程序自己决定如何如获取所需要的类。实现这个动作的代码模块称为“类加载器” 1.类与类加载器 每一个类加载器都有一个独立的类名称空间,由类加载器和类一起合作才能确定一个类在虚拟机中的唯一性。 阅读全文
posted @ 2017-07-30 16:05 竹马今安在 阅读(255) 评论(0) 推荐(0) 编辑
摘要:1.加载 虚拟机需要干三件事: ①、通过一个类的的全限定名来获取定义此类的二进制字节流(没有规定二进制字节流从那里获取,怎样获取,许多java技术也都建立在这基础上) ②将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构(将常量池转变成运行时常量池) ③在内存中生成一个代表这个类的java 阅读全文
posted @ 2017-07-29 11:20 竹马今安在 阅读(1244) 评论(2) 推荐(0) 编辑
摘要:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校检、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 1 类加载的时机 类从被加载到虚拟机内存中开始,到卸载出内存,整个生命周期为下图所示: 其中,加载、验证、准备、初始化和卸载这五个阶段的顺序是确 阅读全文
posted @ 2017-07-28 15:33 竹马今安在 阅读(219) 评论(0) 推荐(0) 编辑
摘要:一个简单的例子: 这段代码会输出多少?不妨进行反编译一下。 通过javap大致可以将上面的两行代码翻译成如下的JVM指令执行代码。 0: iconst_0 1: istore_1 2: iload_1 3: iinc 1, 1 6: istore_1 10: iload_1 0: iconst_0 阅读全文
posted @ 2017-07-28 11:10 竹马今安在 阅读(322) 评论(0) 推荐(0) 编辑
摘要:①无关性的基石 “与平台无关的”得理想最终实现在操作系统的应用层上:Sun公司和其他虚拟机提供商发布了许多可以在各种不同平台上的虚拟机,这些虚拟机都可以载入和执行同一种平台无关的字节码,从而实现了程序的“一次编写,处处运行”。 虚拟机的两种中立特性:一是平台无关性:字节码是构成平台无关性的基石;另一 阅读全文
posted @ 2017-07-24 16:13 竹马今安在 阅读(353) 评论(0) 推荐(0) 编辑