jvm
文章平均质量分 72
jvm 相关的博客总结
请叫我大师兄_
请叫我大师兄
展开
-
一个Java程序的所有JVM参数 VM Flags
怎么看使用的是jdk 1.8ps -ef|grep xxx 找到pidjinfo pid就会展示出这个Java程序好多的信息,输出结果的最后面,有VM的参数,两行,VM Flags。下面是kafka服务服务的jvm参数,我给它切到两个列表里面展示一下。VM Flags:Non-default VM flags:非默认VM标志对应参数的理解-XX:CICompilerCount=4设置最大并行编译数,使用-XX:CICompilerCount=N来调整编译线程的数目原创 2021-11-03 17:28:25 · 1582 阅读 · 0 评论 -
g1gc调优的一次实战记录
Java内存区域 或 Jvm 内存结构线程共享的堆方法区直接内存(非运行时数据区的一部分)线程私有的程序计数器虚拟机栈本地方法栈GC算法1,标记 -清除算法2,复制算法3,标记-压缩算法4,分代收集算法一般将堆分为新生代和老年代。新生代使用: 复制算法老年代使用: 标记 - 清除 或者 标记 - 整理 算法JDK 8 版本之后方法区(HotSpot 的永久代)被彻底移除了(JDK1.7 就已经开始了),取而代之是元空间G1 GCG1 GC是Java H原创 2021-10-24 21:43:16 · 5923 阅读 · 0 评论 -
Java Linux下给程序加上gc日志打印的配置
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/home/ezdata/log/stat/stat-gc.log.$(date +%Y%m%d%H%M) -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=1 -XX:GCLogFileSize=64M原创 2021-07-02 16:25:51 · 1814 阅读 · 2 评论 -
Java内存区域 或 Jvm 内存结构详解
Java 内存区域详解常见面试题基本问题介绍下 Java 内存区域(运行时数据区)Java 对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么)对象的访问定位的两种方式(句柄和直接指针两种方式)拓展问题String 类和常量池8 种基本类型的包装类和常量池一 概述对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像 C/C++程序开发程序员这样为每一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。正是因为原创 2021-04-22 10:50:41 · 668 阅读 · 2 评论 -
Java 现场排查CPU飙升占用过高的方法
linux 环境下,使用top -c 命令,查看服务器上各进程的CPU使用情况。b+ x,然后就能把所关注的行和运行的列给高亮了。如我第一张截图。然后q退出top命令,然后再top -Hp pid,我这就是 top -Hp 426476 查看单个进程里面是哪些线程在实际消耗CPU。选择占比较大的几个线程id,使用命令 printf "%x\n" 54956 把进程id给转成16进制使用jstack命令查看栈信息,具体:jstack 53514 | grep '0xd6ac' -A10-A10原创 2021-04-21 17:21:23 · 3900 阅读 · 8 评论 -
Java 对象何时进入老年代?
在jvm堆内存中分为年轻代与老年代,年轻代又分为Eden区与Survivor区.新对象的创建会分配在年轻代,那么对象何时进入老年代呢?又有什么样的对象适合放在老年代呢?YoungGC与FullGC简单区别YoungGC波及范围小(年轻代),且不会停止应用进程工作,YoungGC发生频率高,但是回收速度较快,对于程序运行没有太大影响.FullGC波及范围广(堆内存与方法区)会停止应用进程工作(视垃圾收集器而定),FullGC发生频率低,但是回收速度一般是YoungGC的十倍以上,对于程序运行影.原创 2021-04-02 11:11:31 · 1496 阅读 · 0 评论 -
jdk自带jvm常用命令总结
Linux 下JDK自带的排查jvm信息的几个命令常用形式jps (java ps)命令含义jps输出pid和进程简单名称jps -l输出pid和完全的包名,应用主类名,jar的完全路径名jps -m输出main method的参数jps -v输出pid name 输出jvm参数jstat命令含义jstat -gc pid 1s 100一秒一次,执行100次,单位都是 kbjstat -gccap原创 2021-01-05 14:32:49 · 508 阅读 · 2 评论 -
当Java jvm 一个线程OOM的时候,其它线程还能运行不?这个进程会gg不?
当一个Java程序报OOM的异常的时候,程序会gg吗?是只有一个线程gg呢,还是整个进程gg呢?/** * JVM 堆内存溢出后,其他线程是否可继续工作 * * @author LiXuekai on 2020/7/27 */public class WhenOom { public static void main(String[] args) { new Thread(() -> { List<byte[]> list原创 2020-07-27 16:40:18 · 943 阅读 · 0 评论 -
G1 GC 全称Garbage-First Garbage Collector 的全面全方位总结
关键描述 G1是一种服务器端的垃圾收集器,应用在多处理器和大内存环境中,在实现高吞吐量的同时,尽可能的满足垃圾收集暂停时间的要求,全堆操作(例如全局标记)与应用程序线程并行执行。这样可以防止与堆或活动数据大小成比例的中断。 G1收集器的设计目标是取代CMS收集器,它同CMS相比,在以下方面表现的更出色:* G1是一个有整理内存过程的垃圾收集器,在回收垃圾的时候会压缩存活对象。不会产生很多内存碎片。* G1的Stop The World(STW)更可控,G1在停顿时间上添加...原创 2020-07-02 10:13:41 · 2304 阅读 · 0 评论 -
concurrent 和 parallel; 并发和并行的区别
在看g1gc文章的时候,把concurrent and parallel phases翻译成并发和并行阶段,感觉这2个词不是一个意思吗?为啥他原始文档要强调这2个词呢。深究一下,果然不是一个意思。总体概念:在单CPU系统中,系统调度在某一时刻只能让一个线程运行,虽然这种调用机制有多种形式(大多数是时间片轮巡为主),但无论如何,要通过不断切换需要运行的线程让其运行的方式就叫并发(concurrent)。而在多CPU系统中,可以让两个以上的线程同时运行,这种可以同时让两个以上线程同时运行的方式叫做并行(p原创 2020-06-28 17:16:30 · 1269 阅读 · 0 评论 -
G1 GC 调优学习 了解有关如何调整和调整G1 GC以进行评估,分析和性能的信息。
G1 GC是Java HotSpot虚拟机的低暂停,服务器风格的分代垃圾收集器。G1 GC使用并发(concurrent)和并行(parallel)阶段来实现其目标暂停时间并保持良好的吞吐量。当G1 GC确定需要进行垃圾收集时,它将首先收集存活数据最少的区域(垃圾优先处理)。垃圾收集器(GC)是一种内存管理工具。G1 GC通过以下操作实现自动内存管理:在年轻一代分配对象,并将老化的对象提升为老一代。 在并发(并行)标记阶段,在老一代中查找存活对象。当Java堆总占用量超过默认阈值时,Java H.原创 2020-06-27 15:37:56 · 3093 阅读 · 0 评论 -
G1 GC 全称 Garbage-First Garbage Collector
介绍Oracle JDK 7.4或更高版本完全支持Garbage-First(G1)垃圾收集器。G1收集器是server-style的垃圾收集器,适用于具有大内存的多处理器计算机。它极有可能满足垃圾回收(GC)暂停时间目标,同时实现高吞吐量。全堆操作(例如全局标记)与应用程序线程并行执行。这样可以防止与堆或活动数据大小成比例的中断。技术说明G1收集器通过多种技术实现了高性能和暂停时间目标。堆被划分为一组大小相等的堆区域,每个堆区域都有一个连续的虚拟内存范围。G1执行并发全局标记阶段,以确定整翻译 2020-06-27 14:39:09 · 628 阅读 · 0 评论 -
Java 字符串常量池到底是在PermGen方法区、是在heap堆里面、还是在Metaspace 元空间里面呢?
要是没有实践过别人书本上的理论的话,就还是会说常量池在方法区里面,要是知道方法区已经随jdk升级,被逐步干掉的话,就会看到有的文章说移动到heap堆里面了,还有极少的说移动到Metaspace里面了,产生了分歧。这个时候就需要实践出真知了。/** * 测试 常量池在分区的位置 * * @author LiXuekai on 2020/6/9 */public class StringConstantPoolTest { public static void main(String[]原创 2020-06-15 17:59:33 · 11998 阅读 · 18 评论 -
Java 内存分区之什么是 CCS区 Compressed Class Space 类压缩空间
了解到什么是ccs区,一般都是实际执行了jstat -gc 之后,看Java堆的gc相关的几个分区的gc信息,前面的s0,s1,e区,o区,还好猜,研究过分区的,不难猜出来这个分区是啥意思,M区虽然不知道是Metaspace元空间,但是错把这个M区当成Method area 方法区,也说的过去。这个ccsc就不好说了。之前的看的文章都没人说这个区是啥。Java之jstat的用法:Java虚拟机 统计信息查看 工具不了解这几个简写单词是啥意思的,可以参考一下之前的这个jstat的文章,里面对每一列原创 2020-06-15 15:47:50 · 11482 阅读 · 7 评论 -
Java 内存分区之 堆外内存 Metaspace 元空间 取永久代PermGen 而代之
在稍微了解Java内存分区的时候,大多数文章都是出自深入理解jvm这本书,上来就是给你分了 程序计数器,Java虚拟机栈,本地方法栈,堆,方法区,还有个直接内存,还说方法区里面有个常量池。在写这本书的时候,jdk还在1.6,但是现在2020年jdk都已经jdk14了,虽然还没普及jdk14,但是估计以后都会使用的吧,就像现在基本最低都要使用jdk1.8一样。1.7是在2011年发布的,1.8是14年发布的,时至今日,内存分区已经有了些许变化。虽然理论还是大差不差的。永久代主要存放以下数据:JVM i原创 2020-06-15 11:50:42 · 3637 阅读 · 0 评论 -
-xms和-xmx设置完之后,堆的大小就真的是设置的大小吗?
前面看了jdk的几个查看jvm信息的命令,然后只看不动手,不用回头就忘记的干干净净了。还是实际使用一下,然后顺便结合着jvm的内存分区,再深层次的记录一下几个分区的名称、大小、gc器、等等。首先,查看一个进程,筛选一个进程,就可以使用jps -mvl ,m让他带上方法参数,v带上设置的jvm参数,l显示完整的运行main方法名称。完了之后,就可以看到这个pid的好多信息了。但是这个看到的不全,还是有些虚拟机默认的参数是看不到的,这个时候已经拿到了pid,再使用jinfo -flags pid,就会显原创 2020-06-13 17:33:56 · 2703 阅读 · 1 评论 -
jstack的使用:Java栈追踪工具
jstack命令打印指定Java进程、核心文件或远程调试服务器的Java线程的Java 栈跟踪。对于每个Java框架,将打印完整的类名、方法名、字节码索引(BCI)和行号(如果可用)。使用-m选项,jstack命令使用程序计数器(PC)打印所有线程的Java和本机帧。对于每个本机帧,打印距离PC最近的本机符号(如果可用)全称: stack trace for java形式:jstack -option pid -F Force a stack dump w...原创 2020-06-11 16:35:38 · 804 阅读 · 0 评论 -
jmap的用法:Java 内存映像工具 jmap -heap pid
jmap [option] <pid>关于 option 的选项,有下面这么几个1,jmap -dump:[live,] format=b, file=filename pidjmap -F -dump:format=b,file=tomcat.txt 113089以hprof二进制格式转储Java堆到指定filename tomcat.txt 的文件中。live子选项是可选的。如果指定了live子选项,堆中只有活动的对象会被转储。想要浏览heap dump,你可以使用j..原创 2020-06-11 10:52:36 · 6235 阅读 · 0 评论 -
jvm 之各种参数及表达的意思
内存相关设置-Xms:初始堆(Heap)大小,默认3670k。当空闲堆内存小于40%时,JVM 就会增大堆内存直到-Xmx 所设置的最大值,可以通过-XX:MinHeapFreeRatio=n 设置其比例。-Xmx:最大堆(Heap)大小,默认64m。当空闲堆内存大于70%时,JVM 会减少堆内存直到-Xms 所设置的最小值,可以通过-XX:MaxHeapFreeRatio=n 设置其比例。-Xmn:新生代大小,增大新生代后会相应减小老年...原创 2020-06-10 17:08:17 · 644 阅读 · 0 评论 -
jinfo的用法:Java配置信息查看工具
实时查看和跳转jvm的各项参数。使用jps -v 可以查看虚拟机启动时,显示指定的参数列表,但是未指定的系统默认的参数就看不到了。就可以使用jinfo -flag 进行查看。 jinfo [ option ] pid jinfo [ option ] executable core jinfo [ option ] [ servier-id ] remote-hostname-or-IP主要有下面几个: 1,no-option ...原创 2020-06-04 18:32:19 · 1018 阅读 · 0 评论 -
jstat各种用法以及结果中每一列的详细含义描述
1, -class 监视类装载、卸载数量,总空间、类装载所耗费时间2,-compiler 输出jit编译器编译过的方法耗时等信息3,-printcompilation 输出已经被jit编译的方法4,-gc 监视Java堆状况,eden,2个s区,old,方法区等容量,gc时间等情况5,-gccapacity 6,-gcutil 已使用空间占此空间的百分比7,-gccause 输出导致上次gc的原因8,-gcnew 统计新生代的gc情况9, -gcnewcapacity 各个最大和最新原创 2020-06-04 11:24:45 · 4064 阅读 · 0 评论 -
jps的用法:Java虚拟机进程状况工具
一般现场出问题,服务器上不会有JProfile之类的工具给你分析问题,有的只是jdk自带的东西,所以,很有必要学习一下jdl自带的命令行工具。一开始,老看别人使用这个jps,还以为是Linux自带的呢,类似cd ls之类的。后来才发现这个是jdk的东西,搞Java的竟然不知道这个,哎,真水。JavaVirtual Machine Process Status Tool命令格式:jps [options ] [ hostid ][options] 参数选项:jps 的参数和对应说明 -q.原创 2020-05-29 11:39:02 · 857 阅读 · 0 评论 -
为什么新生代内存需要有两个Survivor区
1 为什么要有Survivor区先不去想为什么有两个Survivor区,第一个问题是,设置Survivor区的意义在哪里?如果没有Survivor,Eden区每进行一次Minor GC,存活的对象就会被送到老年代。老年代很快被填满,触发Major GC(因为Major GC一般伴随着Minor GC,也可以看做触发了Full GC)。老年代的内存空间远大于新生代,进行一次Full GC消耗的时间...转载 2018-04-03 14:28:47 · 3788 阅读 · 6 评论 -
Java GC算法 and 垃圾收集器
GC算法垃圾收集器概述垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了。jvm中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理,因此,我们的内存垃圾回收主要集中于 java 堆和方法区中,在程序运行期间,这部分内存的分...原创 2018-03-16 15:20:42 · 679 阅读 · 0 评论 -
JVM内存结构
所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能问题,那么这些问题就会变的非常常见,了解JVM内存也是为了服务器出现性能问题的时候可以快速的了解那块的内存区域出现问题,以便于快速的解决生产故障。先看一张图,这张图能很清晰的说明JVM内存结构布局。Java的内存...原创 2017-03-24 11:09:12 · 988 阅读 · 0 评论 -
java类的加载机制
1、什么是类的加载类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。类加载器并不需要等到某个类被“首次主原创 2017-03-23 20:42:22 · 1348 阅读 · 0 评论