jvm学习与理解
Oeljeklaus
python开发,大数据,图数据,数据分析
展开
-
Chapter1.1 JRE和JDK的关系与区别
JDK:Java程序设计语言、Java虚拟机、Java API类库的统称。JRE :Java SE API子集和Java虚拟机的统称。原创 2017-07-10 15:06:10 · 1346 阅读 · 0 评论 -
JVM类加载机制(二):类加载详细描叙
前一节我们讲解了JVM类加载的5个阶段,主要是加载、验证、准备、解析和初始化。加载阶段主要完成3件事情:1.通过类的全限定名来获取定义此类的二进制字节流2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构3.在内存中生成一个代表这个类的java.lang.Class对像,作为方法区这个类的各种数据的访问入口。需要注意的是,加载与连接阶段的部分额呢绒时交叉进行的,可能加载并未结束,连接可...原创 2018-04-28 17:01:38 · 1211 阅读 · 0 评论 -
Java内存模型与线程(一):概述
我们知道,衡量一个服务性能的高低好坏,每秒事物处理数(TPS)是重要的指标之一,它代表着一秒内服务端平均能响应的请求总数。我们知道计算机硬件中,引进了缓存技术,大大提高了程序执行速度,但是这也带来了相关问题,例如缓存一致性问题。下面是计算机处理器和高速缓存驻内存之间的交互关系。Java内存模型Java内存模型的主要目的是定义程序中哥哥变量的访问规则,记载虚拟机中将变量存储到内存和从内存中取出变量的...原创 2018-04-28 21:16:44 · 1201 阅读 · 0 评论 -
Java内存模型与线程(二):内存间交互操作
上一节,我们介绍了线程与Java内存模型之间的关系。这一节,我们将会介绍内存间交互操作,主要是Java内存与各线程之间的关系。也就是说一个变量如何从主内存拷贝到工作内存、如何让从工作内存同步回主内存之类的实现细节。首先,我们需要了解下面8种操作。lock(锁定):作用于主内存的变量;它把这一个变量标识为一个线程独占的状态。unlock(解锁):作用域主内存的变量,把一个变量释放。read(读取):...原创 2018-04-29 15:48:35 · 1437 阅读 · 0 评论 -
Java内存模型与线程(三):volatile型变量的规则
volatile变量一般是比较难以理解,这里坐着希望列举几个小例子让大家充分理解它的使用方法。对于定义了volatile的变量,这里有两条特性需要大家记住:第一、保证此变量对所有的线程都是可见性,这里的可见行是指一个线程修改了这个变量的值,新值对于其他的线程来说是可知的。这里,volatile变量不存在一致性问题,volatile变量在并发情况下并非安全。这通过一段程序说明:package cn....原创 2018-04-29 16:42:38 · 1226 阅读 · 0 评论 -
Java内存模型与线程(四):long和double的特殊规则和原子性、可见性和有序性
JVM将没有被volatile修饰的64为数据的读写操作划分为两次32位的操作,也就是long和double的非原子协定吗,多个线程共享一个long或者是double类型的变量是,可能读到一个"半个变量"的数值。不过以上这种情况非常罕见,所以这两种类型不需要volatile修饰。Java内存模型定了3个特性:原子性、可见性、有序性。原子性,也就是说上几节我们讲到的几个操作都是原子的,要么全部成功,...原创 2018-04-29 18:02:32 · 1373 阅读 · 0 评论 -
Java内存模型与线程(五):先行发生原则
1.程序次序规则:同一个线程,按照代码次序,准确来说是按照控制流顺序而不是程序代码顺序2.管道锁定规则:unlock操作先行于后面对同一个锁的lock操作3.volatile变量规则:对于修饰的变量,这里的写操作先行发生于读操作。4.线程启动规则:Thread对象的start方法先行于发生于此线程的每一个动作。5.线程终止规则:线程所有的操作都先行发生于对此线程的终止检测。6.线程中断规则:对线程...原创 2018-04-29 18:29:24 · 1303 阅读 · 0 评论 -
Java内存模型与线程(六):Java与线程
我们知道,线程是CPU调度的基本单位。线程实现的3种方式:使用内核线程实现、使用用户线程实现和使用用户线程加轻量级进程混合实现。线程调度,主要分为协同式线程调度和抢占式线程调度。Java的线程调度主要是抢占式线程调度。 Java语言定义了5中线程状态:新建:创建后尚未启动的线程处于这种状态。运行:也饿就是对应于操作系统状态中的Running和Readdy。无限期等待:这种状态不会被分配CPU执行时...原创 2018-04-29 19:08:01 · 1223 阅读 · 0 评论 -
设计模式(一)简单工厂模式
设计模式(一):简单工厂模式模式动机 做过Web开发的开发者都知道,在将用户的密码存储在数据库中时,我们需要将密码首先加密然后在写入数据库。 在Java中,我们常用的加密手段有MD5、RSA等。我们使用的代码是:KeyPairGenerator.getInstance("RSA");如果我们需要使用MD5时传入的参数就是MD5。这里,就是我们今天需要讲解的简单工厂模式。...原创 2018-07-14 12:48:01 · 463 阅读 · 0 评论 -
JVM之类加载机制
JVM之类加载机制在一般的强类型语言中,都有预处理、编译、汇编和链接过程,Java一般是将Java编译成class文件后,Java虚拟机需要将class文件在内存后到底发生了什么呢?本文将会带你了解Java的类加载过程01类加载时机类才能够被加载到虚拟机内存中开始,到卸载出内存位置,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和...原创 2019-03-08 21:46:52 · 209 阅读 · 0 评论 -
JVM之垃圾回收算法
JVM之垃圾回收算法相比如C++,Java程序的一大优势是不需要程序员手动释放分配的内容,主要由Java虚拟机管理内存的分配和释放,但是并不意味着我们不需要掌握垃圾回收算法。本文将会带你探索Java虚拟机中主要的垃圾回收算法。01标记-清除算法标记-清除算法是最基本的算法,也会受比较容易实现的垃圾收集算法。这个算法主要分为标记和清除两个阶段...原创 2019-03-09 09:31:43 · 303 阅读 · 0 评论 -
Java并发之Monitor实现
Java并发之Monitor实现可能在synchronized关键字的实现原理中,你已经知道了它的底层是使用Monitor的相关指令来实现的,但是还不清楚Monitor的具体细节。本文将让你彻底Monitor的底层实现原理01简介本文主要翻译Monitors – The Basic Idea of Java Synchronization国外大神的文...原创 2019-03-09 15:30:02 · 3239 阅读 · 1 评论 -
JVM之JIT优化技术(一)
点击上方蓝字,记得关注我们!JVM之JIT优化技术(一)引言本文是JVM之JIT优化技术的开篇,这个在接下来的几章中将会详细讲解JIT优化技术。关于JVM优化和如何使用JIM编译和不同的优化技术让程序运行的更快有很多争论。其实,有很多优秀的文章是可以被找到的,但是对于我自己来说,我还想看看关于这方面的应用,因此我决定对此去深挖和进行一些简单的测量。01延迟编译 ...原创 2019-03-22 19:52:12 · 2002 阅读 · 0 评论 -
JVM之JIT技术(二):内联
点击上方蓝字,记得关注我们!JVM之JIT技术(二):内联引言在JIT技术上,有很多种优化技术,其中内联是一种非常常见的技术,在本文中将会详细的介绍这技术,同时使用数字对比,更加形象的突出内联的运行时间。01在上一篇文章《JVM之JIT优化技术(一)》中,我们使用了大量的篇幅讲解了JIT技术的由来和一些简单的优化步骤,以及优化例子,本文将详细讲解JIT...原创 2019-03-22 21:15:41 · 1058 阅读 · 0 评论 -
JVM之JIT技术(三):逃逸分析,锁消除
点击上方蓝字,记得关注我们!JVM之JIT技术(三):逃逸分析,锁消除引言逃逸分析和锁消除是常用的JIT技术,锁消除常常用来消除不必要的锁。01在上一节中,我们已经分析了JIT的较为简单的技术:内联。这里这一节,我们将会讲解逃逸分析和锁消除。 JVM通过域分析来确定是否一个对象能够从现在方法或者线程的域逃出出去,这被称为逃逸分析。...原创 2019-03-22 21:46:46 · 1107 阅读 · 0 评论 -
JVM类加载机制(一):类初始化触发条件以及几个例子
JVM把描述类的数据从Class文件加载到内存,对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是JVM类加载机制。 Java的类型加载、连接和初始化过程都是在程序运行期间完成的。 类加载到内存,和到卸载出内存为止,整个生命周期:加载、验证、准备、解析、初始化、使用和卸载,等7个阶段,验证、准备、解析3个部门统称为连接。生命周期如下:对类进行初...原创 2018-04-28 15:40:23 · 1750 阅读 · 0 评论 -
JVM:类文件结构
Java实现语言无关的基石是JVM和字节码存储格式。任何一个Class文件都对应唯一一个类或接口的定义信息。,但是反过来说,类或者接口不一定定义在文件中,有可能通过类加载器直接生成。Class文件以8字节为基本单位二进制流存储,当遇到8字节以上时,会按照高位在前的方式分割成若干8字节进行存储。Class文件的格式如下:Class文件的头4个字节表示魔数,主要用来判断是够能被JVM所接受。紧接着4个...原创 2018-04-28 14:55:25 · 1373 阅读 · 0 评论 -
Chapter2.1 JVM内存管理一
Java虚拟机将Java程序所管理的内存分为若干个不同的数据区域,这些区域各自创建时间和销毁时间不同。每一个线程都有独自的程序计数器,相互之间不影响,独立存储,称这块区域为“线程私有”的内存。如果执行本地方法,程序计数器的值为空,如果执行的是Java方法,程序计数器的值为正在执行的虚拟机字节码指令地址原创 2017-07-11 08:41:11 · 1212 阅读 · 0 评论 -
Chapter2.2 JVM内存管理二
Java虚拟机栈是线程私有的,其生命周期和线程一样;用来描述Java方法执行的内存模型:每个方法在执行的同时会创建一个栈桢,用来存储局部变量表、操作栈表、动态链接、方法出口等信息;每个方法从执行到结束的过程,都是栈桢进栈出栈的过程。局部变量表用来存储基本类型和对象引用类型,64位的long和double占用2个存储空间,其他占用一个存储空间,在程序编译期间分配内存。如果程序要求的栈深大于虚原创 2017-07-11 09:38:49 · 1211 阅读 · 0 评论 -
Chapter3.1 垃圾回收器与内存分配策略一
对于对象回收古老的方法有计数算法、可达性分析算法。Java对引用的分类:Java回收机制判断对象是否真的死亡的策略:原创 2017-07-11 14:34:17 · 1224 阅读 · 0 评论 -
Chapter3.1 垃圾回收器与内存分配策略二
方法区,即永生代,主要回收无用的类和废弃常量。常量的回收判断类的回收判断:原创 2017-07-11 14:42:57 · 1217 阅读 · 0 评论 -
Chapter3.2 垃圾收集算法
标记-清除算法:将所有需要清除的对象标记,一次性清除。算法的不足之处:复制算法:标记整理算法:其过程和标记-清除算法一样,但是其并不是对可回收对象进行清除,而是向一端移动,然后直接清除端边界以外的内存。分代收集算法:原创 2017-07-11 14:56:50 · 1272 阅读 · 0 评论 -
Chapter3.2 Java垃圾收集器
Java垃圾收集器:垃圾收集器之间的连线表示收集器可以相互协作,收集器所在的区域表示新生代收集器还是老生代收集器。Serial收集器:1.单线程收集器2.进行垃圾收集时,必须暂停其他所有线程,知道垃圾收集完成。3.简单高效ParNew收集器:1.Serial收集器的多线程版本,回收策略、内存分配、参数设置都相同2.收集效果并不比Serial收集器好原创 2017-07-12 16:57:56 · 1240 阅读 · 0 评论 -
Chapter3.3 HotShop算法的实现
枚举根节点:安全点:安全区域:原创 2017-07-12 16:58:11 · 1198 阅读 · 0 评论 -
Chapter4.1 虚拟机性能监控与故障处理工具一
JDK性能监控与故障处理工具jps:显示正在运行虚拟机进程,虚拟机主类名称以及这些进程的本地虚拟机唯一ID。jps主要参数:jstat:用于监视虚拟机各种运行状态信息的命令行工具。该命令的格式VMID与LVMID的区别:jstat工具的主要参数:jinfo:实时查看和调整虚拟机的各项参数。jinfo命令的格式原创 2017-07-12 19:43:05 · 1254 阅读 · 0 评论 -
Chapter3.4 内存分配与回收策略
现在的商业一般采用分代算法,将虚拟机内存分为新生代、老生代。大多数的对象在Eden区中分配。如果Eden区没有足够的内存分配,虚拟机将会进行一次Minor GC.大对象直接进入老年区,所谓的大对象是指需要连续分配空间的Java对象,例如数组和字符串。长期存活的对象将会进入老年代动态对象年龄判断:空间分配担保原创 2017-07-12 22:19:38 · 1291 阅读 · 0 评论 -
Chapter05 类文件结构一
原创 2017-07-16 15:22:26 · 1292 阅读 · 0 评论 -
Chapter05 类文件结构二
JAVA虚拟机的指令是一个字节长度的、代表着某种特定操作含义的数字(称为操作码)、以及跟随零个至多个代表此操作所需要参数而构成。JVM面向操作数栈而不是寄存器,大多数指令没有操作数,只有操作码。字节码指令集限制JVM操作码的长度为一个字节,这就意味着指令集的操作码总数不能超过256条。原创 2017-07-16 21:22:47 · 1318 阅读 · 0 评论 -
Chpater03 Hadoop组件(三) Hadoop读写
Hadoop分割与读入文件的方式被定义在一个InputFormat的实现中,默认的实现是TextInputFormat;想读取一行内容,但是没有确定键值,这个实现类会将字节偏移作为键值。如果需要自定义InputFormat,就必须实现接口,如下OutputFormat格式OutputFormat的主要实现类原创 2017-07-17 23:17:54 · 1351 阅读 · 0 评论 -
Chpater03 Hadoop组件(二) 剖析MapReduce程序
采用maven来编写程序,功能为合并多个文件为一个文件package hadoop;import java.io.IOException;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FSDataInputStream;import org.apache.hadoop.fs.FSData原创 2017-07-17 22:07:51 · 1366 阅读 · 0 评论 -
Chapter04 编写基本的MapReduce程序(一) 专利数据集实战一
获取专利数据集的网站:http://www.nber.org/patents/需要下载的数据集:pat63_99.txt和Cite75_99.txt专利引用数据的格式如下,采用逗号分隔专利描述数据集,各个字段的意义:大体的程序如下所示:package cn.edu.hust.job;import java.io.IOException;import jav原创 2017-07-18 20:03:14 · 1576 阅读 · 0 评论 -
JVM之JIT技术(四):锁粗化
点击上方蓝字,记得关注我们!JVM之JIT技术(四):锁粗化引言在上面的三篇文章中,我们首先解释了JIT的历史,JIT技术:内联、逃逸分析、锁消除等。但是,这仅仅是适用于单线程,如果需要同步,这个这些就不适合了,现在我们来介绍适用于多线程的JIT技术:锁粗化。01在上一篇文章中,锁消除已经简单的介绍。但是并不是所有的情况可以使用锁消除,这时我们需要使用锁粗化...原创 2019-03-22 22:17:53 · 1058 阅读 · 0 评论
分享