JVM
张--小涛涛
风一样的小涛涛
展开
-
深入理解JVM学习笔记(一、总览)
深入理解JVM原创 2018-05-28 23:23:32 · 1385 阅读 · 0 评论 -
深入理解JVM学习笔记(十八、JVM 垃圾回收机制---前言)
众所周知,java语言不需要像c++那样需要自己申请内存,自己释放内存,这些都是JVM帮我们做好了的,但是对于一名java程序员,想要更近自己的水平更上一层楼,就要去了解GC的工作原理,根据原理才能写出更好的更优的程序。 接下来,我们从三个方面分析JVM 的垃圾回收机制(当然这个三点中还有一些小点,下面已解决列出): 1、如何判断对象是否为垃...原创 2018-08-14 23:40:42 · 341 阅读 · 0 评论 -
深入理解JVM学习笔记(十九、JVM 垃圾回收机制---如何判断对象是否为垃圾【引用计数法】)
一、引用计数法 引用计数算法作为垃圾收集器最早的算法,有其优势,也有其劣势,虽然现在的JVM都不再采用引用计数算法进行垃圾回收【例如Sun的Java hotspot采用了火车算法进行垃圾回收】,但这种算法也并未被淘汰,在著名的单进程高并发缓存Redis中依然采用这种算法来进行内存回收。 直白一点,引用计数算法就是对于创建的每一个对象都有一个与之关联的计数器,这个...原创 2018-09-11 23:27:08 · 456 阅读 · 0 评论 -
深入理解JVM学习笔记(二十二、JVM 垃圾回收机制---如何回收垃圾---回收策略【复制算法】)
上一节我们讲到了标记-清除算法因为需要进行两次内存扫描导致效率不高,那么这一节我们介绍一种复制算法,比较好的解决了这个问题。 讲复制算法前,我们先回顾一下JVM的内存结构。JVM内存大体分为两大块,分别为线程共享区、线程独占区。其中线程共享区主要包括堆内存、方法区。线程独占区主要包括栈内存、本地方法栈、程序计数器。而我们垃圾回收主要针对的是线程共享区的堆内存。 ...原创 2018-09-16 15:22:04 · 222 阅读 · 0 评论 -
深入理解JVM学习笔记(二十三、JVM 垃圾回收机制---如何回收垃圾---回收策略【标记整理算法&分代收集算法】)
可能大家已经注意到了,前几节说的算法都是针对新生代的,那么本节我们来说说老年代的回收算法。 老年代与新生代不同,我们之前提到过,新生代中大约有10%是不可被会收的对象。在老年代恰恰相反,只有大约10%的对象可以被回收。这中特点也就决定了老年代垃圾回收算法会和新生代不同。一、标记整理算法 标记整理算法分为两步: (1)、标记...原创 2018-09-16 17:18:56 · 302 阅读 · 2 评论 -
深入理解JVM学习笔记(二十四、JVM 垃圾回收机制---主流垃圾收集器介绍)
JAVA的跨平台性决定了其部署的服务器类型各异,其内存结构也是大不相同的。因此针对不同的内存结构适用于不同的垃圾收集策略。因此也需要各种各样的垃圾收集器来满足需求。接下来,我们介绍下市场上主流的几个垃圾收集器。一、Serial收集器特点:1、最基本、发展最悠久2、单线程垃圾收集器要理解单线程垃圾收集器,可以举例如下图所示。从图中我们可以看出,当JVM需要进行垃圾回收时候,需要将...原创 2018-09-16 23:16:53 · 415 阅读 · 0 评论 -
深入理解JVM学习笔记(二十、JVM 垃圾回收机制---如何判断对象是否为垃圾【可达性分析法】)
可达性分析法 在主流的商用程序语言中(Java和C#),都是使用可达性分析算法判断对象是否存活的。这个算法的基本思路就是通过一系列名为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当...原创 2018-09-13 08:18:59 · 351 阅读 · 0 评论 -
深入理解JVM学习笔记(二十一、JVM 垃圾回收机制---如何回收垃圾---回收策略【标记-清除算法】)
标记-清除算法是GC中最基础的算法。从名称上看,其可以拆分为两部分:标记(mark)和清除(sweep)。此算法可以分为两个阶段,一个是标记阶段,一个是清除阶段,下面就分别做一下介绍。(1)标记阶段: 在此阶段,垃圾回收器会从mutator(应用程序)根对象开始遍历。每一个可以从根对象访问到的对象都会被添加一个标识,于是这个对象就被标识为可到达对象。(2)...原创 2018-09-14 08:22:30 · 495 阅读 · 0 评论 -
深入理解JVM学习笔记(二十五、JVM 内存分配----概述)
前面我们已经讲到JVM的垃圾回收策略,但是回收的前提是堆内存中有对象数据。那么接下来我们就讲讲JVM在构造对象时候在堆中的内存是如何分配的。内存分配的整体策略:接下来几章我们会详细介绍上述策略。...原创 2018-10-19 07:29:14 · 213 阅读 · 0 评论 -
深入理解JVM学习笔记(二十六、JVM 内存分配----优先分配到eden&空间分配担保)
一、优先分配到eden我们写一个程序来验证对象优先分配到eden,源码如下:package com.zjt.test.jvm008;public class Main { public static void main(String[] args) { byte [] b1 = new byte[4 * 1024 * 1024]; }} 在运行main方法前进行如下配...原创 2018-11-10 17:51:28 · 843 阅读 · 1 评论 -
深入理解JVM学习笔记(二十八、JVM 内存分配----长期存活的对象分配到老年代)
一、长期存活的对象我们讲到长期存活的对象分配到老年代,那么到底怎么样算是长期存活的对象呢。和上一章的大对象一样,JVM也给我们提供了参数去进行配置:-XX:MaxTenu ringThresho。参数默认是15.二、对象年龄机制我们每一个对象有一个AGE属性。当垃圾回收被调用一次AGE+1。当AGE达到15或-XX:MaxTenu ringThresho所指定的值时,JVM便认为对象是...原创 2018-11-13 08:05:48 · 377 阅读 · 0 评论 -
深入理解JVM学习笔记(二十九、JVM 内存分配----空间分配担保策略)
一、概念空间分配担保我们在二十六章也提到过,当内存分配过程中内存不够,JVM会向老年代借用内存,这就是内存分配担保策略。内存分配担保策略JVM默认是启用的,我么可以用-XX:HandlePromotionFailure来禁用内存分配担保策略。开启:-XX:+HandlePromotionFailure关闭:-XX:-HandlePromotionFailure二、策略1、当新生...原创 2018-11-13 08:16:25 · 1107 阅读 · 0 评论 -
深入理解JVM学习笔记(二十七、JVM 内存分配----大对象直接分配到老年代)
一、验证首先我们编写如下程序package com.zjt.test.jvm008;public class Main { public static void main(String[] args) { byte [] b4 = new byte[40 * 1024 * 1024]; }}打开GC控制台输出运行程序,可以看到如下运行结果。 从上图可以看出,在...原创 2018-11-11 17:10:06 · 6641 阅读 · 4 评论 -
深入理解JVM学习笔记(三十、JVM 内存分配----逃逸分析与栈上分配)
一、概念我们之前提到过,JVM堆已经不是对象内存分配的唯一选择。栈上分配就是java虚拟机提供的一种优化技术,基本思想是对于那些线程私有的对象(指的是不可能被其他线程访问的对象),可以将它们打散分配在栈上,而不是分配在堆上。分配在栈上的好处是可以在函数调用结束后自行销毁,而不需要垃圾回收器的介入,从而提供系统的性能。栈上分配的一个技术基础是进行逃逸分析。逃逸分析的目的是判断对象的作用域...原创 2018-11-14 08:28:23 · 426 阅读 · 0 评论 -
深入理解JVM学习笔记(三十一、JVM 内存分配----虚拟机工具介绍(JPS))
一、概念JPS 名称: jps 全称是Java Virtual Machine Process Status Tool。jps是用于查看有权访问的hotspot虚拟机的进程. 当未指定hostid时,默认查看本机jvm进程,否者查看指定的hostid机器上的jvm进程,此时hostid所指机器必须开启jstatd服务。 jps可以列出jvm进程lvmid,主类类名,main函数参数, jvm参...原创 2018-11-21 08:29:48 · 429 阅读 · 0 评论 -
深入理解JVM学习笔记(三十二、JVM 内存分配----虚拟机工具介绍(Jstat))
一、概念Jstat(Java Virtual Machine statistics monitoring tool)是JDK自带的一个轻量级小工具。它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。二、用法Jstat依赖于jps,因为要使用Jstat首先要使用jps获取java进程...原创 2018-12-12 23:40:31 · 295 阅读 · 0 评论 -
深入理解JVM学习笔记(十七、对象的访问定位)
之前我们理解java栈堆时可能会说栈中存储指针,指向堆中的对象地址。其实这种说法是不严谨的,其一是java中没有指针的概念,其二是栈中不一定存储对象的地址,也可能是其他地址。那么问题来了,对象是如何进行访问定位的呢。 虚拟机栈是 java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出...原创 2018-08-06 08:21:39 · 200 阅读 · 0 评论 -
深入理解JVM学习笔记(十六、探究对象的结构)
在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。下图是普通对象实例与数组对象实例的数据结构:对象头HotSpot虚拟机的对象头包括两部分信息:markword 第一部分markword,用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分...转载 2018-07-31 08:14:11 · 213 阅读 · 0 评论 -
深入理解JVM学习笔记(二、JDK、JRE、JVM之间的关系)
JDK=JAVA DEVELOPEMENT KITJRE=JAVA RUNTIME ENVIRONIMENTJVM=JAVA VISUAL MACHINEJDK>JRE>JVM原创 2018-05-29 08:28:31 · 315 阅读 · 0 评论 -
深入理解JVM学习笔记(八、JAVA虚拟机内存管理---JAVA内存区域简介)
JAVA虚拟机内存模型如下图所示: 上图我们可以看到JAVA虚拟机内存模型分为两大块:线程共享区和线程独占区域。 线程共享区:方法区和堆是分配给进程的,也就是所有线程共享的。 线程独占区:栈和程序计数器,则是分配给每个独立线程的,是运行过程中必不可少的资源。其中对各个模块详细解释如下:1、方法区(Method Area) 方法区(Method...原创 2018-06-21 08:19:58 · 223 阅读 · 2 评论 -
深入理解JVM学习笔记(九、JAVA虚拟机内存管理---程序计数器)
深入理解JVM学习笔记(八、JAVA虚拟机内存管理---程序计数器)原创 2018-06-21 23:48:43 · 296 阅读 · 0 评论 -
深入理解JVM学习笔记(三、模拟内存溢出 内存监控方法)
模拟内存溢出一、新建java项目 二、代码如下package com.zjt.test.jvm003;public class Demo {}package com.zjt.test.jvm003;import java.util.ArrayList;public class Main { public static void main(String[] args) {...原创 2018-06-01 00:24:48 · 1504 阅读 · 0 评论 -
深入理解JVM学习笔记(四、JVM可视化监控工具---JConsole)
一、找到JConsole启动exe 前往JDK安装目录,在其bin目录下寻找jconsole.exe文件。二、打开JConsole 因为我们已经将JDK的bin目录配置到了系统变量中,因此我们可以直接打开cmd窗口,输入jconsole来启动她。启动后如下图所示: ...原创 2018-06-06 23:52:08 · 321 阅读 · 2 评论 -
深入理解JVM学习笔记(十、JAVA虚拟机内存管理---JAVA虚拟机栈)
1、JAVA虚拟机栈概述 JAVA虚拟机栈在JAVA虚拟机内存模型中位置如下图所示。 JAVA虚拟机栈是描述JAVA方法执行的动态内存模型。从上图可以看出虚拟机栈中包含很多栈帧。 当虚拟机栈已内存已经使用完了还要继续给里面入栈帧,则会出现我们常见的一个错误,即java.lang.StackOverflowError.2、栈帧 栈帧(stack...原创 2018-06-24 16:26:30 · 308 阅读 · 0 评论 -
深入理解JVM学习笔记(十一、JAVA虚拟机内存管理---JAVA虚拟机本地方法栈)
1、JAVA虚拟机本地方法栈概述 JAVA虚拟机本地方法栈在JAVA虚拟机内存模型中位置如下图所示。 本地方法栈和虚拟机栈是非常相似的。其不同点如下:虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。...原创 2018-06-24 16:30:25 · 299 阅读 · 0 评论 -
深入理解JVM学习笔记(十二、JAVA虚拟机内存管理---堆)
1、JAVA堆概述 JAVA堆在JAVA虚拟机内存模型中位置如下图所示。 堆一种通用性的内存池(存在于RAM中),用于存放所以的JAVA对象。 修改JAVA堆内存大小的参数:-Xmx -Xms -Xms是用来设置你的应用程序能够使用的最大内存数,如果程序要花很大内存的话,那就需要修改增加此数的值。 -Xms是用它...原创 2018-06-24 16:41:38 · 198 阅读 · 0 评论 -
深入理解JVM学习笔记(十三、JAVA虚拟机内存管理---JAVA虚拟机方法区)
1、JAVA虚拟机方法区 JAVA虚拟机方法区在JAVA虚拟机内存模型中位置如下图所示。 方法区和堆一样,是各个线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、和编译器编译后的代码(也就是存储字节码文件。.class)等数据,这里可以看到常量也会在方法区中,是因为方法区中有一个运行时常量池,为什么叫运行时常量池,因为在编译后期生成的是各种字面量(字面...原创 2018-06-24 16:53:03 · 322 阅读 · 0 评论 -
深入理解JVM学习笔记(五、JAVA发展历史)
一、JDK Version 1.0 开发代号为Oak(橡树),于1996-01-23发行 其提出了“Write Once,Run Anywhere”的口号二、JDK Version 1.1于1997-02-19发行。引入的新特性包括:引入JDBC(Java Database Connectivity);引入jar文件格式,沿用至今;引入Java Bean;引入RMI(Remote Me...原创 2018-06-16 20:28:19 · 267 阅读 · 0 评论 -
深入理解JVM学习笔记(六、JAVA技术体系)
JAVA技术体系包含如下:JAV程序语言JAVA编译器 (JAVA CLASS文件格式)JAVA API第三方JAVA 类库各个硬件平台上的JAV虚拟机原创 2018-06-17 11:50:15 · 235 阅读 · 0 评论 -
深入理解JVM学习笔记(七、JAVA虚拟机介绍)
下面,我们对上述JAVA虚拟机产品进行逐一介绍:1、Sun Classic VM 世界上第一款商用虚拟机,只能使用纯解释器的方式来执行JAVA代码,已经被淘汰。2、Exact VM(Exact Memory Management)(准确式内存管理) 已经具备现代高性能虚拟机的雏形:如两级即时编译器、编译器与解释器混合工作模式等。但是只在Solaris平台...原创 2018-06-21 08:00:36 · 447 阅读 · 0 评论 -
深入理解JVM学习笔记(十五、对象的创建)
下图是JAVA虚拟机对象的创建过程:现在我们就以下几点说明对象的创建:1、给对象分配内存给对象分配内存有指针碰撞和空闲列表两种方式。具体描述如下图所示。按时2、线程安全性问题 无论是指针碰撞还是空闲列表,在高并发情况下都有可能存在线程安全性问题。解决方案如下: 1、加同步锁。 安全但是执行效率低。 ...原创 2018-07-26 08:16:26 · 212 阅读 · 0 评论 -
深入理解JVM学习笔记(十四、Java内存区域-运行时常量池和直接内存)
1、运行时常量池 运行时常量池(Runtime Constant Pool),它是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述等信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到常量池中。 运行时常量是相对于常量来说的,它具备一个重要特征是:动态...原创 2018-07-23 08:22:31 · 908 阅读 · 0 评论 -
深入理解JVM学习笔记(三十三、JVM 内存分配----虚拟机工具介绍(jinfo))
一、概念jinfo是jdk自带的命令,可以用来查看正在运行的Java应用程序的扩展参数,甚至支持在运行时,修改部分参数。通常会先使用jps查看java进程的id,然后使用jinfo查看指定pid的jvm信息。二、用法jinfo依赖于jps,因为要使用Jstat首先要使用jps获取java进程的进程号。 格式 jinfo...原创 2018-12-13 08:09:08 · 544 阅读 · 0 评论