JVM
文章平均质量分 92
介绍JVM的相关知识
白夜行515
世界上有两样东西不能直视:一是太阳,二是人心!
展开
-
新一代垃圾回收器ZGC的探索与实践
1. 引入1.1 GC之痛很多低延迟高可用Java服务的系统可用性经常受GC停顿的困扰。GC停顿指垃圾回收期间STW(Stop The World),当STW时,所有应用线程停止活动,等待GC停顿结束。以美团风控服务为例,部分上游业务要求风控服务65ms内返回结果,并且可用性要达到99.99%。但因为GC停顿,我们未能达到上述可用性目标。当时使用的是CMS垃圾回收器,单次Young GC 40ms,一分钟10次,接口平均响应时间30ms。通过计算可知,有(40ms + 30ms) * 10次 /转载 2021-02-17 18:47:18 · 271 阅读 · 0 评论 -
线上Java 高CPU占用、高内存占用排查思路
一、前言处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题。当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警。本文主要针对系统运行缓慢这一问题,提供该问题的排查思路,从而定位出问题的代码点,进而提供解决该问题的思路。二、分析原因对于线上系统突然产生的运行缓慢问题,如果该问题导致线上系统不可用,那么首先需要做的就是,导出j...转载 2019-05-23 16:34:40 · 7998 阅读 · 1 评论 -
【JVM】常用虚拟机参数及实例
常用参数表 参数 描述 -XX:+PrintGC 启动java虚拟机后,只要遇到gc,就打印日志 -XX:+PrintGCDetails gc发生时,打印更详细的日志 -XX:+PrintHeapAtGC 每一次GC后,都打印堆信息 -XX:+PrintGCTimeStamps gc发生时,额外打印gc时间,该时间为虚拟机启动到现在的时间偏移量 -XX:+P原创 2017-06-24 18:49:44 · 1420 阅读 · 0 评论 -
【JVM】线程安全与锁优化
线程安全1.定义当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果2.分类(1)不可变不可变的对象一定是线程安全的,只要一个不可变对象被正确地构建出来(没有发生this引用逃逸情况),那其外部的可见状态永远也不会改变 ,永远也不会看到它在多个线程之中处于不一致的状态。如Inte原创 2017-06-26 11:07:36 · 887 阅读 · 0 评论 -
【JVM】Java内存模型
引入硬件的效率与一致性我们都知道现在计算机的内存与处理器的运算能力有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(cache)来作为内存与处理器之间的缓冲,这引入了一个新的问题:缓存一致性(Cache Coherence)。在多处理器系统中,每个处理器都有自己的高速缓存,而他们又共享同一主存,多个处理器运算任务都涉及同一块主存,需要一种协议可以保原创 2017-06-26 10:17:21 · 329 阅读 · 0 评论 -
【JVM】GC算法与垃圾收集器
引入java 语言中一个显著的特点就是引入了java回收机制,是c++程序员最头疼的内存管理的问题迎刃而解,它使得java程序员在编写程序的时候不在考虑内存管理。由于有个垃圾回收机制,可以有效的防止内存泄露,有效的使用空闲的内存;内存泄露:指该内存空间使用完毕后未回收,在不涉及复杂数据结构的一般情况下,java的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度Java虚拟机的内原创 2017-06-24 17:11:30 · 715 阅读 · 0 评论 -
【JVM】类加载机制
什么是类的加载将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。类的生命周期类的生命周期是从被加载到虚拟机内存中开始,到卸载出内存结束。原创 2017-06-24 20:15:21 · 326 阅读 · 0 评论 -
【JVM】Java内存区域与OOM
引入Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。Java虚拟机运行时数据区如图所示1.程序计数器(线程私有)作用 记录当前线程所执行到的字节码的行号。字节码解释器工作的时候就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。意义 JVM的多线程是通过线程轮流切换并分配处理器来实现的,对于我们来说的并行事实上一个处理原创 2017-06-24 13:54:03 · 1792 阅读 · 0 评论 -
【JVM】堆内存与栈内存详解
堆和栈的定义java把内存分成栈内存和堆内存。(1)栈内存在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。(2)堆内存堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾原创 2017-07-31 10:12:46 · 1028 阅读 · 5 评论 -
【JVM】JDK命令行工具
1.在JDK/bin目录下我发现了许多命令行工具这些命令有哪些作用呢,接下来我就来详细介绍一下2.常用JDK命令行工具 命令名称 全称 用途 jstat JVM Statistics Monitoring Tool 用于收集Hotspot虚拟机各方面的运行数据 jps JVM Process Status Tool 显示指定系统内所有的HotSpot虚拟机进程原创 2017-06-24 21:38:35 · 456 阅读 · 0 评论 -
【JVM】自定义类加载器
1.ClassLoader类介绍(1) 作用:根据一个指定类的名称,找到或者生成其对应的字节代码,从这些代码中定义出一个Java类。即Java.long.Class类的一个实例,还加载Java应用所需的资源,如图像文件、配置文件等。(2) 常用方法:getParent() 返回该类加载器的父类加载器loadClass(String name) 负责加载指定的类,首先会从已加载的类中去寻找,若原创 2017-06-24 20:34:42 · 370 阅读 · 0 评论 -
【JVM】JVM源码分析之Metaspace解密
概述metaspace,顾名思义,元数据空间,专门用来存元数据的,它是jdk8里特有的数据结构用来替代perm,这块空间很有自己的特点,前段时间公司这块的问题太多了,主要是因为升级了中间件所致,看到大家讨论来讨论去,看得出很多人对metaspace还是模棱两可,不是很了解它,因此我觉得有必要写篇文章来介绍一下它,解开它神秘的面纱,当我们再次碰到它的相关问题的时候不会再感到束手无策。为什么会有meta转载 2017-06-26 20:01:35 · 1267 阅读 · 0 评论 -
【JVM】G1垃圾收集器的关键技术
前言G1 GC,全称Garbage-First Garbage Collector,通过-XX:+UseG1GC参数来启用,作为体验版随着JDK 6u14版本面世,在JDK 7u4版本发行时被正式推出,相信熟悉JVM的同学们都不会对它感到陌生。在JDK 9中,G1被提议设置为默认垃圾收集器(JEP 248)。在官网中,是这样描述G1的: The Garbage-First (G1) collec转载 2017-06-26 18:33:49 · 13426 阅读 · 2 评论 -
【JVM】字节码执行引擎
引入class文件就是字节码文件,是由虚拟机执行的文件。也就是java语言和C & C++语言的区别就是,整个编译执行过程多了一个虚拟机这一步。这个在 类文件结构 中已经解释。上一节讲了虚拟机是如何加载一个class的,这一节就讲解虚拟机是如何执行class文件的。运行时栈帧结构1.定义栈是每个线程独有的内存。栈帧存储了局部变量表,操作数栈,动态连接,和返回地址等。每一个方法的执行 对应的原创 2017-06-26 16:54:22 · 393 阅读 · 0 评论 -
【JVM】类文件结构
Class文件的定义一组以8字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑排列在class文件中,中间没有任何分隔符,这使得class文件中存储的内容几乎是全部程序运行的程序。注:Java虚拟机规范规定,Class文件格式采用类似C语言结构体的伪结构来存储数据,这种结构只有两种数据类型:无符号数和表。无符号数属于基本数据类型,主要可以用来描述数字、索引符号、数量值或者按照UTF-8编原创 2017-06-26 13:41:34 · 382 阅读 · 0 评论 -
【JVM】JVM概述
1.JVM定义JVM 是Java Virtual Machine(JVM )的缩写,Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令进行执行,这样实现了Java“一次编译,到处运行”。2.JVM组成JVM由三大部分组成:类加载器(ClassLoader subsystem),执行引擎(Execution Engine),内存区(Runtime data areas)。 3. JVM执原创 2017-06-24 10:22:04 · 425 阅读 · 0 评论