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

摘要: 首先,什么是类的加载?类的加载由类加载器执行.该步骤将查找字节码(classpath指定目录),并从这些字节码中创建一个Class对象。Java虚拟机为每种类型管理一个独一无二的Class对象。也就是说,每个类(型)都有一个Class对象。一旦某个类的Class对象被载入到内存,他就被用来创建这个类阅读全文
posted @ 2017-08-12 10:37 竹马今安在 阅读(302) | 评论 (1) 编辑
摘要: 前面的几篇都没有太明确地指出 方法区 是什么?现在通过一些资料的收集和学习,下面做一些总结 什么是方法区: 方法区是系统分配的一个内存逻辑区域,是JVM在装载类文件时,用于存储类型信息的(类的描述信息)。 方法区存放的信息包括: 类的基本信息: 1.每个类的全限定名 2.每个类的直接超类的全限定名(阅读全文
posted @ 2017-08-12 10:32 竹马今安在 阅读(253) | 评论 (0) 编辑
摘要: 类加载过程: 1, JVM会先去方法区中找有没有相应类的.class存在。如果有,就直接使用;如果没有,则把相关类的.class加载到方法区 2, 在.class加载到方法区时,会分为两部分加载:先加载非静态内容,再加载静态内容 3, 加载非静态内容:把.class中的所有非静态内容加载到方法区下的阅读全文
posted @ 2017-08-12 10:22 竹马今安在 阅读(15) | 评论 (0) 编辑
摘要: JVM 内存分配模型概念 --在工作中可能用到的机会不多,有个概念的了解 --此文是转载某位读者,应该是在阅读了《深入理解Java虚拟机JVM高级特性与最佳实践》 一书后,总结所得。写的不错,转载哈 一、JVM内存区域划分 大多数 JVM 将内存区域划分为 Method Area(Non-Heap)阅读全文
posted @ 2017-08-12 10:15 竹马今安在 阅读(12) | 评论 (0) 编辑
摘要: 本文主要内容: Trace跟踪参数 堆的分配参数 栈的分配参数 零、在IDE的后台打印GC日志: 既然学习JVM,阅读GC日志是处理Java虚拟机内存问题的基础技能,它只是一些人为确定的规则,没有太多技术含量。 既然如此,那么在IDE的控制台打印GC日志是必不可少的了。现在就告诉你怎么打印。 (1)阅读全文
posted @ 2017-08-06 09:54 竹马今安在 阅读(45) | 评论 (0) 编辑
摘要: 面向过程的编程思想: 程序编写都是以算法为核心的,程序员会把数据和过程分别作为独立的部分来考虑,数据代表问题空间中的客体,程序代码则用于处理这些数据,这种思维方式直接站在计算机的角度去抽象问题和解决问题 面向对象的编程思想: 站在现实世界的角度去抽象和解决问题,把数据和行为都看做是对象的一部分,这样阅读全文
posted @ 2017-08-05 16:51 竹马今安在 阅读(7) | 评论 (0) 编辑
摘要: Java的并发采用的是共享内存模型(而非消息传递模型),线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。多个线程之间是不能直接传递数据交互的,它们之间的交互只能通过共享变量来实现 同步是显式进行的。程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行。 1、多线程阅读全文
posted @ 2017-08-05 10:21 竹马今安在 阅读(24) | 评论 (0) 编辑
摘要: 1.硬件的效率与一致性 由于计算机的存储设备与处理器的运算速度有几个数量级的差别,而绝大多数的运算任务都要与内存交互,所以现代计算机系统不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存来作为内存与处理器之间的缓冲:将运算需要使用到的数据复制到缓冲之中,让运算能快速进行,当运算结束后再从缓存同阅读全文
posted @ 2017-08-05 10:18 竹马今安在 阅读(11) | 评论 (0) 编辑
摘要: 最初java程序是通过解释器进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”。为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器! 即时编译器并不是虚拟机必须的阅读全文
posted @ 2017-08-04 17:07 竹马今安在 阅读(10) | 评论 (0) 编辑
摘要: 1.泛型与类型擦除 泛型的本质是参数化类型的应用,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口和泛型方法。在泛型没有出现之前,只能通过Object是所有类型的父类和类型强制转换两个特点的配合来实现类型泛化,由于java语言所有的类型都阅读全文
posted @ 2017-08-03 17:22 竹马今安在 阅读(7) | 评论 (0) 编辑
摘要: java语言的“编译期”其实是一段“不确定”的操作过程,可能是指一个前端编译器把.java变成.class的过程,也可能是指虚拟机的后端运行期编译器(JLT)把字节码转变成机器码的过程,也有可能是使用静态提前编译器(AOT)直接把.java文件直接编译成本地机器代码的过程。现在讨论的是第一种编译器。阅读全文
posted @ 2017-08-03 12:41 竹马今安在 阅读(12) | 评论 (0) 编辑
摘要: 虚拟机调用方法可以有解析和分派两种方式,那么虚拟机是如何执行方法中的字节码指令的? 1.解释执行 谈是解释执行还是翻译执行没有意义了,只有确定了某种具体的java实现版本和执行引擎运行模式时,谈解释执行还是编译执行才比较贴切。 如今,基于物理机、java虚拟机,或者非Java的其他高级语言虚拟机的语阅读全文
posted @ 2017-08-03 10:31 竹马今安在 阅读(41) | 评论 (0) 编辑
摘要: 方法调用阶段唯一的任务就是确定被调用方法的版本(调用的是哪一个方法),暂时还不涉及方法内部的具体运行过程。Class文件的编译过程中 不包含传统编译过程中的“连接”,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址。这给java带来更强的动态扩展功能的阅读全文
posted @ 2017-07-31 18:01 竹马今安在 阅读(65) | 评论 (0) 编辑
摘要: 执行引擎是java虚拟机最核心的组成部分之一。在java虚拟机中制定了虚拟机字节码执行引擎的概念模型,这个概念模型成了各种虚拟机执行引擎的统一外观。在不同的虚拟机实现里面,执行引擎可能会有解释执行和编译执行两种选择,也可能两者兼备,甚至还可能会包含几个不同级别的编译器执行引擎,但是从外观上看起来,所阅读全文
posted @ 2017-07-31 11:11 竹马今安在 阅读(42) | 评论 (0) 编辑
摘要: ClassLoader翻译过来就是类加载器,普通的Java开发者其实用到的不多,但对于某些框架开发者来说却非常常见。理解ClassLoader的加载机制,也有利于我们编写出更高效的代码。ClassLoader的具体作用就是将class文件加载到jvm虚拟机中去,程序就可以正确运行了。但是,jvm启动阅读全文
posted @ 2017-07-30 18:08 竹马今安在 阅读(94) | 评论 (0) 编辑
摘要: 准备阶段的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到了Java虚拟机外部去实现,以便让应用程序自己决定如何如获取所需要的类。实现这个动作的代码模块称为“类加载器” 1.类与类加载器 每一个类加载器都有一个独立的类名称空间,由类加载器和类一起合作才能确定一个类在虚拟机中的唯一性。阅读全文
posted @ 2017-07-30 16:05 竹马今安在 阅读(7) | 评论 (0) 编辑
摘要: 1.加载 虚拟机需要干三件事: ①、通过一个类的的全限定名来获取定义此类的二进制字节流(没有规定二进制字节流从那里获取,怎样获取,许多java技术也都建立在这基础上) ②将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构(将常量池转变成运行时常量池) ③在内存中生成一个代表这个类的java阅读全文
posted @ 2017-07-29 11:20 竹马今安在 阅读(234) | 评论 (0) 编辑
摘要: 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校检、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 1 类加载的时机 类从被加载到虚拟机内存中开始,到卸载出内存,整个生命周期为下图所示: 其中,加载、验证、准备、初始化和卸载这五个阶段的顺序是确阅读全文
posted @ 2017-07-28 15:33 竹马今安在 阅读(11) | 评论 (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 竹马今安在 阅读(5) | 评论 (0) 编辑
摘要: ①无关性的基石 “与平台无关的”得理想最终实现在操作系统的应用层上:Sun公司和其他虚拟机提供商发布了许多可以在各种不同平台上的虚拟机,这些虚拟机都可以载入和执行同一种平台无关的字节码,从而实现了程序的“一次编写,处处运行”。 虚拟机的两种中立特性:一是平台无关性:字节码是构成平台无关性的基石;另一阅读全文
posted @ 2017-07-24 16:13 竹马今安在 阅读(20) | 评论 (0) 编辑
摘要: ①jps:虚拟机进程状况工具 功能:列出正在运行的虚拟机进程,并显示1、虚拟机执行主类名称以及2、这些进程的本地虚拟机唯一ID(LVMID)。 使用频率最高的JDK命令行工具,其他的JDK工具大多需要输入它查询到的LVMID来确定监控的是哪一个虚拟机进程。 对于本地虚拟机进程来说,LVMID与操作系阅读全文
posted @ 2017-07-23 17:26 竹马今安在 阅读(78) | 评论 (0) 编辑
摘要: 如何去给对象分配内存?大方向讲,就是在堆上分配(但也可能经过JIT编译后被拆散为标量类型并间接地在栈上分配) ①对象优先在Eden分配 大多数条件下,对象在Eden中分配,当Eden内存不够的时候,虚拟机将发起一次Minor GC。 java堆占10MB,Eden占8MB,创建前三个对象在Eden中阅读全文
posted @ 2017-07-23 10:52 竹马今安在 阅读(5) | 评论 (0) 编辑
摘要: 新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也非常快 老年代GC(Major GC/Full GC):指发生在老年代的GC,出现了Major GC ,经常会伴随至少一次的Minor GC(但并非绝对阅读全文
posted @ 2017-07-23 09:23 竹马今安在 阅读(16) | 评论 (0) 编辑
摘要: JVM的GC日志的主要参数包括如下几个: -XX:+PrintGC 输出GC日志 -XX:+PrintGCDetails 输出GC的详细日志 -XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式) -XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形阅读全文
posted @ 2017-07-22 19:38 竹马今安在 阅读(11) | 评论 (0) 编辑
摘要: 概述 JVM有两种运行模式Server与Client。两种模式的区别在于,Client模式启动速度较快,Server模式启动较慢;但是启动进入稳定期长期运行之后Server模式的程序运行速度比Client要快很多。这是因为Server模式启动的JVM采用的是重量级的虚拟机,对程序采用了更多的优化;而阅读全文
posted @ 2017-07-22 16:38 竹马今安在 阅读(772) | 评论 (0) 编辑
摘要: (A)、图中展示了7种不同分代的收集器: Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1; (B)、而它们所处区域,则表明其是属于新生代收集器还是老年代收集器: 新生代收集器:Serial、ParNew、Parallel 阅读全文
posted @ 2017-07-22 16:32 竹马今安在 阅读(72) | 评论 (0) 编辑
摘要: ①枚举根节点 可达性分析中,查找引用链这个操作,可作为GC Roots的节点主要在全局性的引用中(例如常量和静态属性)和执行上下文(例如栈帧中的本地变量表)中,现在很多应用本地方法区就有数百找,要一个个查引用的话,太费时间,另外,可达性分析对时间的敏感性还体现在GC停顿上,因为这项分析工作必须在一个阅读全文
posted @ 2017-07-21 16:26 竹马今安在 阅读(7) | 评论 (0) 编辑
摘要: 1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能。你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用,这样就会对堆的所有区域进行扫描。而我们的很多对象都是朝生夕死的,如果分代的话,阅读全文
posted @ 2017-07-21 16:19 竹马今安在 阅读(11) | 评论 (0) 编辑
摘要: ① 标记-清除算法 最基础的收集算法分为“标记”和“清除”两个阶段;首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。也就是在判断对象生存还是死亡用到的算法 不足:一是效率不高,而是标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能导致以后再程序运行过程中需要分配较大对象时,阅读全文
posted @ 2017-07-21 16:13 竹马今安在 阅读(10) | 评论 (0) 编辑
摘要: java内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈3个区域的生命周期与线程相同;栈帧中随着方法的进入和退出有条不紊的执行着出栈和入栈操作,每一个栈帧中分配多少内存在类结构确定下来时就一致的,因此这几个的内存分配和回收都具备确定性,在这几个区域就不需要过多考虑回收的问题,因为方法结阅读全文
posted @ 2017-07-20 17:48 竹马今安在 阅读(8) | 评论 (0) 编辑
摘要: 以常用的HotSpot和常用的Java堆为例,深入探讨HotSpot虚拟机在Java堆中对象分配、布局和访问的全过程 1.对象的创建 ①虚拟机遇到一条new指令后,首先将去检查这个指令的参数是否能够在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否已经被加载、解析和初始化过,如果没有,阅读全文
posted @ 2017-07-19 15:31 竹马今安在 阅读(19) | 评论 (0) 编辑
摘要: Java与C之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”。 C、C++程序开发在内存管理区域,既拥有每一个对象的“所有权”,又担负着每一个对象声明开始到终结的责任,而Java在虚拟机自动管理机智的帮助下,不需要为每一个new操作去写配对的delete/free操作,不容易发生内存泄漏和内存阅读全文
posted @ 2017-07-19 09:54 竹马今安在 阅读(14) | 评论 (0) 编辑
摘要: Java 技术体系 1.java技术语言 2.各种硬件平台上的java虚拟机 3.Class文件格式 4.Java API类库 5.来自商业机构和开源社区的第三方Java类库 我们把Java程序设计语言、Java虚拟机、Java API类库统称为JDK,JDK是用于支持Java开发的最小环境 可以把阅读全文
posted @ 2017-07-19 08:53 竹马今安在 阅读(14) | 评论 (0) 编辑