
JVM
雪落南城
这一场人间流浪,长随步履温柔相候
展开
-
Linux定位问题线程名
1、首先top命令定位到java进程 pid2、使用 top -H -p [pid] 分析该进程内各线程的cpu使用情况其中-p [pid]表示查找指定进程的信息,-H表示线程模式。3、将步骤2中定位的pid转换为16进制printf ‘%x\n’ pid4、在jstack分析线程的状态jstack [pid] |grep ‘nid’pid为步骤1中获取的java进程pidnid为步骤3中转化的数字...原创 2020-10-23 11:12:21 · 497 阅读 · 0 评论 -
记一次线上jvm堆大小设置大于机器内存
首先我想说,牛逼。背景由于一个服务迁移到了我们组,线上报了一个swap.used.percent = 100,然后观察gc日志发现了一个young gc时间达到12s的case冷静分析这个服务所在的机器配置是4c8g,讲道理,如果用到了swap,说明机器内存不足啊!看了一下这个服务的堆内存大小是12G!就,牛逼。解决方案1.升级机器2.修改堆大小...原创 2020-10-12 18:02:09 · 2632 阅读 · 0 评论 -
JVM堆大小与机器内存大小的一点探究
一个非核心服务申请的机器是2c4G同时设置的-Xms =4g ,-Xmx = 4g理论上机器系统、线程等都需要一部分内存空间的,所以我们通常设置的JVM堆大小小于机器内存但为什么这个服务没有问题呢?这里涉及到linux内存从硬件上看,Linux系统的内存空间由两个部分构成:物理内存和SWAP(位于磁盘)。物理内存是Linux活动时使用的主要内存区域;当物理内 存不够使用时,Linux会把一部分暂时不用的内存数据放到磁盘上的SWAP中去,以便腾出更多的可用内存空间;而当需要使用位于SWAP的数据时,原创 2020-09-23 11:38:38 · 1181 阅读 · 0 评论 -
查看Java进程中线程数topN脚本
#!/bin/shts=$(date +"%s")jvmPid=$1defaultLines=100defaultTop=20threadStackLines=${2:-$defaultLines}topThreads=${3:-$defaultTop}jvmCapture=$(top -b -n1 | grep java )threadsTopCapture=$(top -b -n1 -H | grep java )jstackOutput=$(echo "$(jstack $jv原创 2020-07-28 16:16:57 · 283 阅读 · 0 评论 -
记录一次Metaspace OOM的问题
事件4.13号测试部署的服务突然爆oom异常第一次OOM异常如下:2020-04-14 14:42:43.092 - - [ERROR] Druid-ConnectionPool-Create-755299134 DruidDataSource (DruidDataSource.java:2699) create connection SQLException, url: jdbc:my...原创 2020-04-16 13:00:15 · 3276 阅读 · 0 评论 -
MetaSpace浅析
jdk1.8后 使用metaSpace代替了永久代我们在使用metaSpace会设置两个参数:官网java8相关参数-XX:MetaspaceSize=size含义:当metaspace达到size值时,出发fullgcSets the size of the allocated class metadata space that will trigger a garbage coll...原创 2020-04-15 16:31:57 · 868 阅读 · 0 评论 -
OOM和StackOverFlow的区别
1、stackoverflow原创 2020-02-25 23:23:27 · 5409 阅读 · 0 评论 -
如何查看正在运行中的java程序,它的某个JVM参数是否开启?具体值是多少?
1、首先使用jps -l 或者 jcmd选中正在执行的java进程2、 使用jinfo + 进程号 可以查看java进行信息F:\IdeaProjects\facetest>jinfo 12576Attaching to process ID 12576, please wait...Debugger attached successfully.Server comp...原创 2020-02-24 10:02:01 · 2849 阅读 · 0 评论 -
可以作为GC ROOT的对象
1、虚拟机栈-局部变量表 中引用的对象2、方法区中 类静态属性 引用的对象3、方法区中 常量 引用的对象4、本地方法栈中 JNI 引用的对象原创 2020-02-24 00:55:00 · 626 阅读 · 3 评论 -
GC-常用参数配置
通用参数-Xms 堆内存初始大小-Xmx 堆内存最大大小-Xmn 新生代大小-Xss线程大小-XX:+UserG1GC 指定使用G1垃圾回收器-XX:SurvivorRatio eden区和一个survivor区比例 eden/survivor 注意S区有两个-XX:MaxTenuringThreshold 新生代进入老年代的年龄(即在新生代躲过了几次GC)-XX:-Us...原创 2019-11-19 18:20:07 · 1768 阅读 · 0 评论 -
GC-优化思路
尽量让每次Young GC 后的存活对象小于Survivor区的50%,都留存在年轻代里。尽量别让对象进入老年代。尽量减少Full GC频率,避免Full GC对JVM性能的影响。1、堆内存比较大的机器,建议使用G1回收器设置停顿时间 JDK版本>=1.82、观察gc记录 jstat -gc pid每次gc之后存活对象的大小,是否因为S区太小导致部分对象进入老年代或者...原创 2019-11-19 15:18:46 · 288 阅读 · 0 评论 -
Java内存诊断
传统的Java诊断工具:1、jconsole控制台输入 :jconsole在jvm启动参数中加入 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimestamps -XX:+PrintGCApplicationStopedTime -Xloggc:文件路径用法: jconsole [ -interval=n ] [ -notil...原创 2019-04-29 10:12:43 · 575 阅读 · 0 评论 -
本地代码模拟GC
JVM参数-Xms20m -Xmx20m -Xmn10m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps如果想将gc记录放入日志中 则 再添加 -Xloggc:gc.log新生代 10M 其中 Eden区8M老年代 10M1、模拟young gcpublic static void main(String[] args) throws Except...原创 2019-11-18 12:34:44 · 686 阅读 · 0 评论 -
GC-G1垃圾回收器
1、G1内存区域划分G1将内存区域划分为一个个的Region,每个Region的大小一致,这些Region可以属于新生代(Eden,S0,S1),也可以属于老年代,也可以专门存放大对象,也可以处于空闲态 谁也不属于。G1根据情况动态地分配Region,但新生代和老年代有一个各自的最大占比,然后在新生代的Eden区满的时候,触发新生代垃圾回收。2、G1相关参数-Xms 堆内存初始大小-Xm...原创 2019-11-14 11:39:14 · 371 阅读 · 0 评论 -
GC相关问题
1、创建对象时,放入新生代的内存顺序一定首先是eden区,然后survivor1区吗?答:仅仅放在Eden区,Survivor区是用来放每一次Minor GC后存活的对象的示例:1.对象都是在Eden区分配的,然后依次Minor GC过后,存活对象转移到S1区,此时Eden区就清空了2.然后接着系统继续运行,对象继续分配在Eden区,下一次Minor GC过后,看看Eden区+S1里的存活...原创 2019-11-13 19:34:03 · 923 阅读 · 3 评论 -
GC-对象进入老年代的条件
1、对象经历了15次 Minor GC 依旧存活 (默认值 -XX:MaxTenuringThreshold = 15)2、Survivor区中 同龄对象大小超过Survivor区空间的50%,大于此年龄的对象会进入老年代 (动态对象年龄判定) (其实是这个年龄以及低于这个年龄的对象占据超过Survivor 50% 1+2+3大于50% 则大于等于3岁的对象会进入老年代)此处可以参考:ht...原创 2019-11-13 14:26:42 · 2387 阅读 · 0 评论 -
GC流程图
本流程图不考虑新对象大于新生代Eden区可用大小不考虑大对象直接进入老年代注:JDK1.6之后废弃了HandlePromotionFailure参数,只需满足”老年代可用空间>新生代对象总和“ 或者 ”老年代可用空间>历次Minor GC升入老年代对象的平均大小“ 其中之一,即可直接进行Minor GCJDK1.8 默认开启HandlePromotionFailure...原创 2019-11-12 19:02:42 · 1170 阅读 · 0 评论 -
JVM学习-GC
转载:https://juejin.im/post/5a15be736fb9a044fc4464d6一、前言 JAVA GC(Garbage Collection,垃圾回收)机制是区别C++的一个重要特征,C++需要开发者自己实现垃圾回收的逻辑,而JAVA开发者则只需要专注于业务开发,因为垃圾回收这件繁琐的事情JVM已经为我们代劳了,从这一点上来说,JAVA还是要做的比较完善一...原创 2019-04-30 11:31:09 · 205 阅读 · 0 评论 -
JVM性能调优
1、JPS 使用jps -helpjps -l 查看所有的java进程 进程号 + java进程名jps -l | grep javajps -l -v | grep postloan 查看含postloan的进程号 进程名 及 JVM参数2、JSTAT 使用https://blog.youkuaiyun.com/zhaozheng7758/article/details/8623...原创 2019-04-02 15:19:25 · 129 阅读 · 0 评论 -
JVM-垃圾回收器
https://blog.youkuaiyun.com/tjiyu/article/details/53983650原创 2019-09-06 19:18:33 · 192 阅读 · 0 评论 -
JVM虚拟机栈
思维导图:虚拟机栈是线程独享的栈帧是虚拟机栈的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态链接和方法返回地址等信息。每一个方法从调用开始至执行完成的过程,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。栈帧的概念结构:1、局部变量表 局部变量表(Local Variable Table)是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。局部变量表...原创 2019-09-24 10:17:46 · 205 阅读 · 0 评论 -
jvm 性能调优工具之 jcmd
参考:https://cloud.tencent.com/developer/article/1130026概述在JDK1.7以后,新增了一个命令行工具 jcmd。他是一个多功能的工具,可以用它来导出堆、查看Java进程、导出线程信息、执行GC、还可以进行采样分析(jmc 工具的飞行记录器)。命令格式 jcmd <pid | main class> <comm...原创 2019-09-25 10:09:54 · 3095 阅读 · 0 评论 -
JVM参数
原文:https://www.cnblogs.com/redcreen/articles/2037057.html不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM、GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java程序的工作效率。但是调整GC是以个极为复杂的过程,由于各个程序具备不同的特点,如:...原创 2019-09-25 10:13:52 · 113 阅读 · 0 评论 -
jvm 性能调优工具之 jstat
原文:https://cloud.tencent.com/developer/article/1130030概述Jstat是JDK自带的一个轻量级小工具。全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size...原创 2019-09-25 10:16:29 · 181 阅读 · 0 评论 -
VisualVM分析一次OOM
1、VisualVMVisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优。这些功能包括生成和分析海量数据、跟踪内存泄漏、监控垃圾回收器、执行内存和 CPU 分析,同时它还支持在 MBeans 上进行浏览和操作。2、模拟一次OOM 并生成dump文件JVM参数设置-Xms64M -Xmx64M ...原创 2019-09-25 11:29:44 · 1613 阅读 · 2 评论 -
JVM分析工具-Arthas阿尔萨斯
官方教程:https://alibaba.github.io/arthas/quick-start.html一、下载使用wget https://alibaba.github.io/arthas/arthas-boot.jarjava -jar arthas-boot.jar 即可启动,然后选择需要操作的Java进程 输入序列号1/2/3/4...回车即可注: ...原创 2019-09-27 14:58:10 · 482 阅读 · 0 评论 -
JVM学习-JVM结构
转自:https://www.cnblogs.com/zwbg/p/6194470.html1 java虚拟机的基本结构如图:1)类加载子系统负责从文件系统或者网络中加载Class信息,加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中可能还会存放运行时常量池信息,包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)。2)java堆在...转载 2019-04-30 11:27:52 · 113 阅读 · 0 评论