
JVM
文章平均质量分 73
祁_z
这个作者很懒,什么都没留下…
展开
-
【jstat命令】查看jvm内存占用和GC情况
jstat命令查看新生代、老年代空间大小以及使用大小,元空间大小、GC回收情况。原创 2022-10-27 10:24:27 · 4809 阅读 · 0 评论 -
G1和CMS的三色标记法及漏标问题
首先标记有三个阶段: 初始标记 -> 并发标记 -> 最终标记 -> (拷贝存活区域对象)初始标记: 只会标记GCRoot直接关联的对象并发标记: 基于初始标记时标记的对象作为起点, 标记所有(属性)关联的对象最终标记: 处理漏标问题 (并发标记阶段, 漏标的GCRoot可达的对象)什么是三色标记标记复制算法中的标记阶段所用到的标记算法(三色标记算法);GC如果想查找到存活的对象,根据GCRoot可达分析算法 根据GCRoot引用链遍历存活对象。根据GCRoot..原创 2022-04-16 18:16:22 · 3696 阅读 · 1 评论 -
查看JVM使用的什么垃圾收集器
添加启动参数-XX:+PrintCommandLineFlags-XX:+PrintCommandLineFlags 项目启动后会在控制台打印当前使用的JVM信息参数控制台打印-XX:InitialHeapSize=83886080 -XX:MaxHeapSize=83886080-XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedClassPointers -XX:+UseCompressedOops...原创 2021-08-25 14:16:12 · 3302 阅读 · 0 评论 -
Arthas java诊断工具 - 热更新代码(jad对类反编译,mc生成class,redefine加载外部class)
官网demo:https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=arthas-advanced案例:对已上线的/get接口中的helloArthas(1),1是写死的,如何在不停机的情况下将1改为2? -> 热更新代码浏览器访问:/get接口Arthas - 热更新代码以下为了方便直接在window上进行操作,linux系统操作相同。1. 首先下载arthas-boot.jar,原创 2020-10-18 11:56:24 · 2321 阅读 · 0 评论 -
jvm - Arthas java诊断工具 - 线程相关(thread -b找出当前阻塞其他线程的线程)
线程相关api:https://arthas.aliyun.com/doc/thread模拟线程堵塞@RequestMapping("/get") public void get(){ // 模拟3条线程调用master()方法 for (int a = 0; a < 3; a ++){ new Thread(){ @Override public void r..原创 2020-10-23 11:42:34 · 2901 阅读 · 1 评论 -
类加载器 - 热部署原理和使用类加载器修改已部署的代码Demo
热部署对于Java应用程序来说,热部署就是在运行时更新Java类文件。场景:将代码发布到生产环境后,发现代码逻辑错误需要将add方法中加入参数String c,如何在不停机的情况下,将参数c加上去? >>> 使用热部署功能;首先生成新的User.class然后将旧版本有问题的User.class替换掉,并重新调用类加载器ClassLoader进行加载。需要注意的是:如果只是替换掉旧的User.class文件是不生效的,必须要调用类加载器,让类加载...原创 2020-12-27 12:14:29 · 728 阅读 · 0 评论 -
字节码技术(.class二进制文件)
首先要清楚什么是字节码要运行一段Java源码,必须先将源码转换为class文件,class文件就是编译器编译之后供虚拟机解释执行的二进制字节码文件,可以通过IDE工具或者命令行去将源码编译成class文件。这里我们使用命令行去操作,运行下面命令:javac Demo.java就会生成一个Demo.class文件。我们打开这个Demo.class文件看下。这里用到的是Notepad++,需要安装一个HEX-Editor插件。以上素材来自:https://blog.youkuaiyun.com.原创 2020-12-26 13:20:44 · 1203 阅读 · 0 评论 -
jvm栈 - 栈帧调试bug
目录jvm栈栈中数据为什么先进后出?idea-debug查看栈帧调用顺序jvm栈- 每个线程都有自己独立的栈,先进后出(俗称压栈)。- 结构:局部变量、方法(栈帧)。栈中数据为什么先进后出?看以下案例中,最后调用执行的bb()方法,在执行完后就没用了可以销毁,所以后进的方法先出栈。 idea-debug查看栈帧调用顺序...原创 2020-09-05 16:12:52 · 511 阅读 · 0 评论 -
四种引用 - 强引用、软引用、弱引用、虚引用
1. 强引用强引用:被引用关联的对象永远不会被垃圾收集器回收Object object=new Object();那object就是一个强引用了。如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。public static void main(String[] args) { // 强引用原创 2020-08-30 14:03:42 · 348 阅读 · 0 评论 -
类加载器 - class类加载过程、ClassLoder类加载器及ClassLoder双亲委托机制
类加载大致流程类加载到JVM流程结构图加载Mayikt.class的整个流程及jvm结构图;1. 线程共享的为颜色,线程私有的为颜色;2. jdk1.8及之后版本方法区改名为元空间;什么是类加载器将我们class文件读取到内存中。读取class文件来源那些自己写的java源代码 编译成class文件 硬盘读取 通过网络的方式下载class文件 War、Jar 解压之后都是class文件 从数据库中读取class文件 Java动态代理模式 反射/cg...转载 2020-08-16 16:19:57 · 308 阅读 · 1 评论 -
JVM调优案例分析
首先99%的对象都会在eden区被回收,剩下的1%晋升老年代。什么样的对象会进入老年代?1.大对象会直接进入老年代。2. 长期存活的对象3. 空间担保:一时间很多对象进入eden区(eden内存占满)又同时进行gc的时候,就会直接进入老年代为什么出现空间担保问题?新生代设置的太小!或大量并发时,eden区gc进入s0区这些对象都还在被引用,然后s0全部数据直接进入老年代。如果查看是否出现空间担保问题?通过名称....可以看到s0/s1区对象年龄达到15的时候...原创 2020-06-14 12:14:32 · 238 阅读 · 0 评论 -
Jstack排查JVM - 死锁、CPU爆满、堆溢出/泄漏问题
定位 - 死锁首先如果是本地开发环境可以通过JVisualVM查看是否有长时间休眠的线程。注意:正式部署版本不会用JVisualVM,会留下漏洞。采用jstack排查死锁需要以下几步:1. 命令:jps查看服务器上所有java服务进程。2. 命令:jstack PID 打印当前服务运行的所有线程快照, 也可以通过jstack PID > a.txx 将线程快照输出到文件中便于查看。3. 快照文件内直接搜deadlock如果有结果表示存......原创 2020-10-23 11:43:26 · 2804 阅读 · 0 评论