
Java虚拟机
系统化的整理下JVM的知识。
姜秀丽
人一生中大部分时间都在工作,如果你的工作恰巧又是自己喜欢的,那么你的大部分时间就都在做喜欢的事情,何其乐哉!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
java线上环境分析特定线程运行情况
一、top看进程查看服务器上的cpu和内存等使用情况。shift+p: 进程会按照cpu使用率高的来排序。shift+m: 进程会按照内存占用情况高的来排序。二、top看线程通过top查出异常的进程pid后,我们来看下进程的线程的运行情况:top -Hp pid从其中,我们可以看到哪些线程的使用情况不太正常。得到系统层面的线程nid。三、jstack线程dump接下来我们通过jstack命令dump出目前的进程情况。jstack pid > a.dump四、找到要分析的线程原创 2020-06-23 11:25:32 · 392 阅读 · 0 评论 -
如何进行问题排查?— JVM系列(十三)
前言学以致用,至此JVM中关于内存部分的理论知识与工具的使用,我们已经搞定了。那么接下来,本文,将重点就如何运用这些知识与工具来进行故障处理和调优进行叙述。64位Java虚拟机采用64位JDK来管理大内存,需要注意的问题:产生堆溢出几乎无法产生堆转储快照,哪怕产生了快照也几乎无法进行分析,因为dump文件会很大,达到十几个G。相同程序在64位JDK消耗的内存一般比32位JDK大,这是...原创 2020-04-18 23:07:00 · 666 阅读 · 0 评论 -
虚拟机性能监控与故障处理 — 两个可视化工具 — JVM系列(十二)
一、前言JDK中除了提供大量的命令行工具外,还有两个功能强大的可视化工具Jconsole和VisualVM。二、JconsoleJconsole是一种基于JMX的可视化监视、管理工具,它管理部分的功能是针对JMX MBean进行管理,我们主要关注的是Jconsole的监控部分的功能。Jconsole既可以监控本地进程,也可以连接远程的服务器。我们打开JDK中的Jconsole,然后选择想...原创 2020-04-15 10:14:28 · 232 阅读 · 0 评论 -
虚拟机性能监控与故障处理 — 命令行工具 — JVM系列(十一)
前言给一个系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。这里的数据包括:运行日志异常堆栈GC日志线程快照(threaddump/javacore)堆转储快照(headdump/hprof文件)等JDK中自带的命令,能在处理应用程序性能问题、定位故障时发挥很大的作用。生产环境,无论是直接接触物理服务器,还是远程Telnet到服务器上都可能会...原创 2020-04-14 11:04:59 · 197 阅读 · 0 评论 -
Java中的垃圾收集器如何设置 — JVM系列(十)
JVM中的重要参数我们已经知道了有哪些垃圾收集器,那么它们在JDK中又是如何设置的呢?参数功能UseParNewGC使用ParNew + Serial OldUseSerialGC虚拟机运行在Client模式下的默认值,是Serial + Serial OldUseParallelGC虚拟机运行在Server模式下的默认值,Parallel Scaveng...原创 2020-04-10 15:06:57 · 2533 阅读 · 0 评论 -
Java中垃圾收集器都有哪些?又是如何配合进行垃圾回收的?它们的使用场景是什么? — JVM系列(九)
前言垃圾回收算法,我们已经了解过。那么有哪些垃圾收集器?它们的使用场景是什么?它们又是如何运用垃圾回收算法来进行垃圾回收的呢?一、Serial收集器新生代的收集器。采取的复制算法。单线程的收集器,它只会使用一个CPU或一条收集线程去完成垃圾收集工作。在它进行垃圾收集时,必须暂停其他所有的用户线程,直到它收集结束。HotSpot虚拟机为消除或者减少工作线程因内存回收而导致停顿的努力一...原创 2020-04-10 15:02:58 · 662 阅读 · 0 评论 -
虚拟机如何发起内存回收?— JVM系列(八)
一、OopMap—记录引用位置在可达性算法中,可作为GC Roots的节点需要在全局性的引用(如常量或类静态属性)与执行上下文(如栈帧中的本地变量表)中,如果逐个检查会消耗很多时间。当系统执行GC,停顿下来时,并不需要一个不漏的检查完所有执行上下文和全局的引用位置,虚拟机应当有办法直接得知哪些地方存放着引用。在HotSpot的实现中,是使用一组称为OopMap的数据结构来达到这个目的的。在...原创 2020-04-09 14:44:19 · 301 阅读 · 0 评论 -
垃圾收集算法 — JVM系列(七)
前言本文将介绍几种垃圾回收算法的思想,以及其发展过程。以下共四种垃圾回收算法。一、标记—清除算法这个算法是最基础的算法,算法分为标记和清除两个阶段:首先标记出所有需要回收的对象在标记完成后统计回收所有标记的对象此算法有两个不足:效率问题:标记和清除的效率都不高。空间碎片问题:会产生大量的不连续的内存碎片。二、复制算法为了解决效率的问题,复制算法出现了。它将可用内存按容...原创 2020-04-08 17:45:15 · 159 阅读 · 0 评论 -
垃圾收集回收哪些对象?— JVM系列(六)
一、垃圾回收的目标是Java堆1、程序计数器与虚拟机栈程序计数器与虚拟机栈不必考虑内存的分配与回收的问题。JVM中的程序计数器和虚拟机栈都是随着线程的建立而建立,随着线程的消亡而消亡的。另外其中存储的一些基本类型变量以及引用对象和返回结果使用内存也基本是固定的。2、Java堆Java堆中的内存的分配与回收是动态的,垃圾收集器所主要关注的就是这部分内存。一个接口中的多个实现类需要...原创 2020-04-08 17:09:27 · 527 阅读 · 0 评论 -
什么情况下发生OutOfMemoryError异常?— JVM系列(五)
前言JVM中除了程序计数器外,其他区域都会发生OutOfMemoryError异常。那么当发生时,我们如何判断是哪个区域发生的?发生异常时,我们如何进行排查和处理呢?一、Java堆的溢出1、设置堆大小我们可以通过如下参数来设置Java堆的内存情况:-Xms:堆的最小的初始化内存空间。-Xmx:堆的最大可允许分配内存空间。-XX:+HeapDumpOnOutOfMemoryErr...原创 2020-04-06 16:00:05 · 1121 阅读 · 2 评论 -
JVM中如何访问到对象 — JVM系列(四)
前言之前的系列文章中,已经写过,我们的Java虚拟机栈中除了有局部变量表外,还有对象的引用reference。那么reference里面是如何存放对象的地址的呢?我们如何通过reference定位到对象呢?目前比较主流的对象访问方式有两种:直接指针句柄访问一、句柄访问什么句柄访问呢?就是在Java堆中有一块专门的内存空间用来存放句柄,叫做句柄池。句柄中存放着:对象在堆中的...原创 2020-04-03 23:03:44 · 255 阅读 · 0 评论 -
JVM中Java对象的创建过程 — JVM系列(二)
前言Java的中的以下几种对象,在内存中存放位置:new出来的普通对象克隆出来的对象反序列化出来的对象Class对象数组前三种是存放在Java堆中的,后两种是存放在方法区中的。以下重点描述的是Java堆中创建一个对象的流程。第一步:检查类是否加载过第一步:检查对象所属的类是否才运行时常量池中定位到了一个类的符号引用,并且这个类是否已被加载,解析和初始化过,如果没有,需要先进...原创 2020-04-03 18:35:01 · 200 阅读 · 0 评论 -
Java对象在JVM中的内存布局 — JVM系列(三)
前言在HotSpot虚拟机中,对象在内存中存储的布局分为3块区域:对象头实例数据对其填充对象头对象头中包括两部分信息:第一部分用于存储对象自身的运行时数据,长度为32位或64位:哈希码GC分代年龄锁状态标志线程持有的锁偏向线程ID偏向时间戳因为对象头占用的空间比较小,所以空间不是固定的数据结构,是随着状态不同,而存储的内容不同:存储内容标志位状...原创 2020-04-03 18:19:40 · 335 阅读 · 0 评论 -
JVM中的内存分布及其中存储的内容 — JVM系列(一)
1、前言Java程序的最大特点就是不用程序员对内存进行管理,它是由Java虚拟机自动管理的,那么Java虚拟机中的内存是如何组织分布的呢?2、程序计数器正在执行的虚拟机字节码指令的地址。3、Java虚拟机栈Java方法执行的内存模型。每个方法在执行的同时都会创建一个栈帧,用以存储:局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法从调用直至执行完成的过程,都对应这...原创 2020-04-02 20:57:55 · 518 阅读 · 0 评论