jvm进阶
Burgess_Lee
对编程语言和新技术非常感兴趣,志同道合者我们一起来学习,如有好的建议或不对的地方, 还希望广大程序猿予以指正。
展开
-
jvm01
《深入理解Java虚拟机》 周志明首先需要了解对应的jvm内存模型。栈主要用来存放基本类型变量,局部变量以及对象的引用。当我们将一个对象作为方法的参数时,我们在方法中改变对象的值,也会影响到原来的对象的值,因为我们只是改变了图中内存区域的值,他的指引(地址)还是一样的。同时也可以看出,栈的内存区域是连续的,有大小限制的,如果超过了就会抛出栈溢出的异常StackOverflowError。...原创 2018-08-14 18:25:38 · 109 阅读 · 0 评论 -
jvm14
今天的是对JAVA 类加载机制方面的总结和拆解之后的虚拟机方面主要针对的是类加载。什么是类加载呢?当我们写完一个Java类的时候,并不是直接就可以运行的,它还要编译成.class(字节码)文件,再由虚拟机解释给当前的操作系统去执行。这些过程都是我们看不见的,我们能看见的也就是一个.class文件。既然虚拟机要解释这些.class文件给当前的操作系统,那么他怎么获得这些.class文件呢?虚...转载 2018-09-03 10:47:37 · 121 阅读 · 0 评论 -
jvm19
Class文件常量池上一篇博客简单的介绍了一下class文件的格式。不清楚的小伙伴,请看一下上篇内容。本篇主要对class文件中的常量池进行重点的分析和介绍。魔数后面分别是次版本号和主版本号。由上图可知其分别占用两个字节。 接下来就是说明常量的个数了。代表着常量池中有多少个常量,由于常量池中的常量数量不确定,所以才会有这个数据项。依然看上图可知该数据项是占用2个字节,因此顺着主版本...转载 2018-09-04 21:30:08 · 175 阅读 · 0 评论 -
jvm18
本篇博客是对class文件结构的简单总结与认识。.class文件是一个由8位二进制构成一个字节的字节码文件,里面的格式都是按照规定好的顺序紧凑的排列在文件中。在.class文件中,他的数据都是以无符号数和表的形式存储的,后面我们进行.class文件的分析就是以这个为基础的,所以我们先了解一下基本的概念。 无符号数用来描述一些东西,比如字符串值、索引、数字、数量值等等。并且使用u1,u...转载 2018-09-04 16:57:21 · 157 阅读 · 0 评论 -
jvm17
本篇博客主要是对准备-解析-初始化过程的介绍。在类的装载过程之后,接下来就是校验阶段了,该阶段的目的就是确保上一阶段读进来的二进制字节流中包含的信息符合虚拟机的规范,并且不会危害虚拟机自身。校验主要分为四个方向:文件格式校验、元数据校验、字节码校验和符号引用校验。 校验过后就是准备阶段了。该阶段就是为类变量分配内存以及设置初始值。注意:这里的分配内存和设置初始值针对仅仅只是类变量,如:pu...转载 2018-09-04 16:43:47 · 172 阅读 · 0 评论 -
jvm12
JAVA 可视化分析工具今天要讲解的工具位于JDK目录的bin目录下,这里都是JDK为我们提供用于分析内存的一些工具。下面是jconsole.exe,JAVA监视与管理控制台。 package test04;import java.util.ArrayList;import java.util.List;/** * JConsole.exe 测试使用 * @Package ...转载 2018-08-29 23:20:12 · 152 阅读 · 0 评论 -
jvm16
这篇博客主要是对JAVA 双亲委派模型的一些介绍。上篇博客说到了类加载器,稍微回想一下。上篇介绍了如何获得二进制的字节流,并根据获得的字节流去装载一个类。同时也了解到类加载器的存在,每个加载器对应着不同的加载目录,相互配合着,从而使整个加载过程稳定而安全。 下面我们开始本篇博客。图中除了最底下的那个加载器是我们没有讲到的,其余的都有说到过。其实底下那个就是我们自己实现的类加载器,用于自...转载 2018-09-04 13:55:50 · 153 阅读 · 0 评论 -
jvm10
老年代收集器 老年代存活的一般是大对象以及生命很顽强的对象,因此新生代的复制算法很明显不能适应该区域的特性,所以老年代采用的是“标记-清除-整理”算法。Serila Old收集器:该收集器是Serial收集器的老年代版,同样是一个单线程的收集器,优劣势和Serial收集器一样,这里就不多说了。 Parallel Old收集器:在我们之前文章的代码例子中默认的年老代收集器,也是Parall...转载 2018-08-25 14:28:21 · 138 阅读 · 0 评论 -
jvm13
之前都是对内存模型相关的知识的,简要总结一下,进行查漏补缺。内存基本分为JAVA栈、本地方法栈、堆和方法区。 首先栈存放的是基本类型变量,局部变量,和对象的引用,他在内存中是一块连续的区域,有大小限制,是由系统自动分配的,因此它的读写速度比较快,而且会自动释放掉为该变量所分配的内存空间;还有一点就是他还存放线程调用方法时存储局部变量表,操作,方法出口等与方法执行相关的信息。堆是存放对象...转载 2018-08-31 16:42:44 · 171 阅读 · 0 评论 -
jvm07
下面来通过gc日志分析堆内存。堆又分为了新生代,年老代。下面主要通过一些参数配置,来来控制新生代,老年代,内存如何分配等问题。首先我们来了解几个相关的参数:-XX:+PrintGCDetails:用于告诉虚拟机回收垃圾的时候顺便打印日志 -Xloggc:路径 :将打印出来的日志信息保存至指定的路径 -Xmn10M:设置新生代的内存大小 -XX:SurvivorRatio=8:1调...原创 2018-08-20 21:48:42 · 101 阅读 · 0 评论 -
jvm06
上节提到了标记。下面来说说标记的事情。是不是被标记了就肯定会被回收呢?我们都知道Object类有一个finalize()方法,所有类都继承了Object类,因此也默认实现了这个方法。 finalize方法: 在该对象被回收之前,该对象的finalize()方法会被调用。这里的回收之前指的就是被标记之后,问题就出在这里,有没有一种情况就是原本一个对象开始不在上一章所讲的“关系网”(...原创 2018-08-20 20:33:17 · 101 阅读 · 0 评论 -
jvm11
JAVA G1收集器是面向整个堆的收集器。特点:多线程的收集器,能够充分利用多个CPU进行工作,收集方式也与CMS收集器类似,因此不会有太久的停顿。 虽然回收的范围是整个堆,但还是有分代回收的回收方式。在年轻代依然采用复制算法;年老代也同样采用“标记-清除-整理”算法。但是,新生代与老年代在堆内存中的布局就和以往的收集器有着很大的区别:G1将整个堆分成了一个个大小相等的独立区域,叫做r...转载 2018-08-27 17:08:41 · 538 阅读 · 0 评论 -
jvm09
年轻代收集器jvm08文章中提到的STW即GC时候的停顿时间,他会暂停我们程序中的所有线程。如果STW所用的时间长而且次数多的话,那么我们整个系统稳定性以及可用性将大大降低。我们在必要的时候需要对虚拟机进行调优,调优的主要目标之一就是降低STW的时间,也就是减少Full GC的次数。那么这里我们从调优的角度来分析各个收集器的优势与不足。 首先从作用于年轻代的收集器开始(采用复制的收集算法)...转载 2018-08-23 13:18:41 · 112 阅读 · 0 评论 -
jvm08
对于JVM,垃圾回收首先是要经过标记的。对象被标记后就会根据不同的区域采用不同的收集方法。当虚拟机完成两次标记后,便确认了可以回收的对象。但是,垃圾回收并不会阻塞我们程序的线程,他是与当前程序并发执行的。所以问题就出在这里,当GC线程标记好了一个对象的时候,此时我们程序的线程又将该对象重新加入了“关系网”中,当执行二次标记的时候,该对象也没有重写finalize()方法,因此回收的时候就会回收...转载 2018-08-23 13:14:22 · 101 阅读 · 0 评论 -
jvm05
GC之标记 堆分为年轻代和年老代。永久代是非堆内存,它又叫做方法区(一般的说法),主要存储已被加载的类信息、常量、静态变量。而该区域在java8已被删除,取而代之的是元空间。 1.标记 标记就是对一些已死的对象打上记号,方便垃圾收集器的清理。 至于怎么标记,一般有两种方法:引用计数和可达性分析。 (1)引用计数实现起来比较简单,就是给对象添加一个引用计数器,每...原创 2018-08-17 17:51:48 · 101 阅读 · 0 评论 -
jvm04
利用MAT排查堆溢出如果在代码中使用了一个无限循环来为list添加对象,如果采用默认的堆大小的话,可能要等待好久才能出现堆溢出的错误,因此我们要将其设置小一点: -Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError(-Xms10m,意思就是堆的最小内存为10m。同理 -Xmx10m的意思就是最大内存也为10m)。-XX:+HeapDumpOnOu...原创 2018-08-17 17:38:22 · 97 阅读 · 0 评论 -
jvm03
内存分配与回收策略主要是对新生代和老年代的进一步整理。堆是存放对象以及数组的区域,但不是胡乱的有空间就分配的内存。堆在内存中分为了年轻代、年老代。 我们先看看年轻代,这个区域又被分为了一个Eden和两个Survivor区,即伊甸园和存活区。他们的关系是8:1。那为什么Eden占用这么多呢?因为对象都会在Eden区创建。每次只使用Eden区和一个Survivor区,当这两个区满了之后...原创 2018-08-15 18:00:13 · 121 阅读 · 0 评论 -
jvm02
对象就存在图中的内存区域,在JVM中,那片区域叫做堆! 堆在内存中并不是一块连续的区域,他是分散的(物理上是分散,但逻辑上是连续的,大家好好体会一下);虚拟机通过栈中引用的指引在堆中找到所需要的对象。在虚拟机遇到一条new的指令的时候,经过一系列的操作过后(现在讲的话会看不懂)虚拟机就要为该新生对象分配内存空间了,那么问题来了,这么散,虚拟机要怎么知道如何分配呢?分配的方式有两种:指针碰撞...原创 2018-08-15 17:51:02 · 116 阅读 · 0 评论 -
jvm15
JAVA 类加载器上面说到了java的类装载机制。不明白的朋友,可以去看一下上篇博客。这篇博客主要是java类装载器的相关知识点。将类加载机制5个阶段中的第一个阶段,加载,又叫做装载。装载的第一步就是要获得二进制的字节流,它可以从读.class文件获得,也可以从网络中接收别人发送的字节流。反正只要符合虚拟机规定的字节流格式都可以进入这个阶段。 有了字节流之后,要进行装载还需要一个工具,...原创 2018-09-03 11:01:59 · 164 阅读 · 0 评论