
JVM
文章平均质量分 94
JVM
fedorafrog
这个作者很懒,什么都没留下…
展开
-
JVM参数设置示例
任何新的业务系统在上线以前都需要去估算服务器配置和JVM的内存参数,这个容量与资源规划并不仅仅是系统架构师的随意估算的,需要根据系统所在业务场景去估算,推断出来一个系统运行模型,评估JVM性能和GC频率等等指标。以下是我结合大牛经验以及自身实践来总结出来的一个建模步骤:计算业务系统每秒钟创建的对象会佔用多大的内存空间,然后计算集群下的每个系统每秒的内存佔用空间(对象创建速度)设置一个机器配置,估算新生代的空间,比较不同新生代大小之下,多久触发一次MinorGC。转载 2023-02-23 21:18:26 · 1572 阅读 · 0 评论 -
ZGC详解
一, ZGC简介和性能G1的目标是在可控的停顿时间内完成垃圾回收,所以进行了分区设计,在回收时采用部分内存回收(在YGC时会回收所有新生代分区,在混合回收时会回收所有的新生代分区和部分老生代分区),支持的内存也可以达到几十个GB或者上百个GB。为了进行部分回收,G1实现了RSet管理对象的引用关系。基于G1设计上的特点,导致存在以下问题:停顿时间过长,通常G1的停顿时间要达到几十到几百毫秒;这个数字其实已经非常小了,但是我们知道垃圾回收发生导致应用程序在这几十或者几百毫秒中不能提供服务,在某些场景中转载 2021-02-10 15:28:46 · 6945 阅读 · 1 评论 -
三色标记法与读写屏障
1.概述首先:CMS和G1都使用了三色标记法关于垃圾回收算法,基本就是那么几种:标记-清除、标记-复制、标记-整理。在此基础上可以增加分代(新生代/老年代),每代采取不同的回收算法,以提高整体的分配和回收效率。无论使用哪种算法,标记总是必要的一步。这是理算当然的,你不先找到垃圾,怎么进行回收?垃圾回收器的工作流程大体如下:能标记的都是可用的,未标记的都是垃圾标记出哪些对象是存活的,哪些是垃圾(可回收);进行回收(清除/复制/整理),如果有移动过对象(复制/整理),还需要更新引用。本转载 2021-02-10 15:06:55 · 511 阅读 · 0 评论 -
Java的对象头和对象组成详解
在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。下图是普通对象实例与数组对象实例的数据结构:1. 对象头java的对象头由以下三部分组成:1,Mark Word2,指向类的指针3,数组长度(只有数组对象才有)1.1 Mark WordMark Word记录了对象和锁有关的信息,当这个对象被synchronized关键字当成同步锁时,围绕这个锁的一系列操作都和Mar转载 2021-02-07 21:56:20 · 1236 阅读 · 1 评论 -
JVM对象分配详解
1. JVM对象分配流程2.栈上分配JVM提供的一项优化技术,它的基本思想是,对于那些线程私有对象(指不可能被其他线程访问的对象)可以将它们打散分配在栈上,而不是分配在堆上。基本思想: 将线程私有的对象打散分配在栈上优点:可以在函数调用结束后自行销毁对象,不需要垃圾回收器的介入,有效避免垃圾回收带来的负面影响 栈上分配速度快,提高系统性能局限性: 栈空间小,对于大对象无法实现栈上分配栈上分配依赖于逃逸分析和标量替换。2.1逃逸分析逃逸分析是一种分析技术,分析对象的..转载 2021-02-07 21:36:04 · 718 阅读 · 0 评论 -
内存屏障在CPU、JVM、JDK中的实现
1. 前言内存屏障(英语:Memory barrier),也称内存栅栏,内存栅障,屏障指令等,是一类同步屏障指令,它使得 CPU 或编译器在对内存进行操作的时候, 严格按照一定的顺序来执行, 也就是说在内存屏障之前的指令和内存屏障之后的指令不会由于系统优化等原因而导致乱序。大多数现代计算机为了提高性能而采取乱序执行,这使得内存屏障成为必须。语义上,内存屏障之前的所有写操作都要写入内存;内存屏障之后的读操作都可以获得同步屏障之前的写操作的结果。因此,对于敏感的程序块,写操作之后、读操作之前可以插入转载 2021-02-04 19:41:38 · 438 阅读 · 1 评论 -
类加载机制
1. 原理(类的加载过程及其最终产品)JVM将class文件字节码文件加载到内存中, 并将这些静态数据转换成方法区中的运行时数据结构,在堆(并不一定在堆中,HotSpot在方法区中)中生成一个代表这个类的java.lang.Class 对象,作为方法区类数据的访问入口。2. 过程JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程。其中加载、检验、准备、初始化和卸载这个五个阶段的顺序是固定的,而解析则未必。为了支持动态绑定,解析这个过程可以发生在初始化阶转载 2020-12-23 15:44:08 · 127 阅读 · 0 评论 -
JVM的GC日志解析
前言刚开始接触JVM时,对待GC的日志,是保持"逃避"态度的,线上部署的程序没有达到期望的运行效率,或是预期目标时,往往会把问题的矛头指向内存上。是不是内存不够?GC日志怎么这么多?占用磁盘高达几个G?不想看到打印怎么多,甚至暴力的将程序日志屏蔽掉。我也曾经这样干过,写过的程序,同样导致过内存溢出,甚至是主机宕机。是的,java中的垃圾回收的确帮我们省了很多事,我们不像C/C++程序员一样,需要考虑分配(malloc)内存分配与(free)释放内存,但我相信每个java开发的转载 2020-07-03 11:02:10 · 2196 阅读 · 0 评论 -
JVM调优-命令篇
运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole、大名鼎鼎的VisualVM,IBM的Memory Analyzer等等,但是在生产环境出现问题的时候,一方面工具的使用会有所限制,另一方面喜欢装X的我们,总喜欢在出现问题的时候在终端输入一些命令来解决。所有的工具几乎都是依赖于jdk的接口和底层的这些命令,研究这些命...转载 2020-04-21 19:10:23 · 307 阅读 · 0 评论 -
JVM调优-工具篇
16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其中就包括如何利用工具来监控调优前后的性能变化。工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗费性能的分析(dump文件分析)一般也不会在生产直接分析,往往dump下来的文件达1G左右,人工分析效率较低,因此利用工具来分析jvm相关问题,长长可以到达事半功倍的效果来。jvm监控分析工具一般...转载 2020-04-21 18:59:08 · 242 阅读 · 0 评论 -
使用ASM实现简单的AOP
1. 前言之前一直使用greys及其内部升级二次开发版来排查问题。最近周末刚好事情不多,作为一名程序员本能地想要弄懂这么神奇的greys到底是怎么实现的?周末从github上拉了代码仔细读了读,其基本技术框架是JVM attach + Instrumentation + asm实现的。关于JVM attach和Instrumentation的功能,下次再写文章介绍,本文着重于greys中非常神...转载 2020-02-27 16:27:27 · 1442 阅读 · 0 评论 -
Java 字节码增强技术ASM概述
1. ASM概述1.1 简介ASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM从类文件中读入...转载 2020-02-27 16:15:45 · 658 阅读 · 0 评论 -
Java Instrument原理简介
1 Java Instrument能做什么?最大的作用? 使开发者可以构建一个独立于应用程序的代理程序Agent,用来监控和协助运行在JVM上的程序,更重要的是能够替换和修改某些类的定义; 最大的作用:可以实现一种虚拟机级别支持的AOP实现方式; 2 在JDK 1.5 、1.6中,Java Instrument做了哪些变动支持? JDK 1.5:支持静态Instr...转载 2020-02-27 15:56:49 · 720 阅读 · 0 评论 -
Java Attach机制
1. 什么是Attach机制简单点说就是jdk的一些工具类提供的一种jvm进程间通信的能力,能让一个进程传命令给另外一个进程,并让它执行内部的一些操作,比如说我们为了让另外一个jvm进程把线程dump出来,那么我们运行了一个jstack的进程,然后给它传了个pid的参数,告诉它要对哪个进程进行线程dump,既然是两个进程,那肯定涉及到进程间通信,以及传输协议的定义,比如要执行什么操作,传了什...转载 2020-02-27 15:38:59 · 3096 阅读 · 0 评论 -
G1垃圾回收器详解
1. 概述G1垃圾回收器是在Java7 update 4之后引入的一个新的垃圾回收器。G1是一个分代的,增量的,并行与并发的标记-复制垃圾回收器。它的设计目标是为了适应现在不断扩大的内存和不断增加的处理器数量,进一步降低暂停时间(pause time),同时兼顾良好的吞吐量。G1回收器和CMS比起来,有以下不同:G1垃圾回收器是compacting的,因此其回收得到的空间是连续的。这避免了...转载 2020-02-25 20:16:49 · 25611 阅读 · 12 评论 -
JVM参数详细配置说明
对于大多数应用来说,Java 堆(Java Heap)是Java 虚拟机所管理的内存中最大的一块。Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。1. JVM内存结构由上图可以清楚的看到JVM的内存空间分为3大部分:堆内存 方法区 栈内存其中栈内存可以再细分为java虚拟机栈和本地方法栈,堆内存可以划分为新生代和老年代,新生代中还可以再次划分为Eden区...转载 2020-02-25 19:43:39 · 13791 阅读 · 0 评论 -
JVM基础
1.基本概念JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接的交互。2. JVM内存区域JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【 JAVA 堆、方法区】、直接内存。线程私有数据区域生命周期与线程相同...转载 2020-02-25 19:38:22 · 285 阅读 · 0 评论