wordpress域名替换,太原关键词优化公司,网站主页面设计,营销策划公司简介阿丹#xff1a; 一个优秀的程序员#xff0c;是因为在线上的排查以及遇到的线上、生产事故较多所以定位问题以及解决问题会比普通程序员快很多#xff0c;所以一个优秀的程序员要逐渐形成自己的方法论#xff0c;来完善和解决问题。
我们是如何发现问题的呢#xff1f; …阿丹 一个优秀的程序员是因为在线上的排查以及遇到的线上、生产事故较多所以定位问题以及解决问题会比普通程序员快很多所以一个优秀的程序员要逐渐形成自己的方法论来完善和解决问题。
我们是如何发现问题的呢
阿丹常用
1、使用 Prometheus 监控 JVM
2、使用Arthas来定位和找到具体问题
3、定位到问题进行修改验证
另外一种方式
1、打印日志
2、获取到对应的dump文件
3、使用MAT工具进行分析
4、定位到问题进行修改验证
补充说明MAT:
MATMemory Analyzer Tool是一款用于Java堆转储分析的强大工具。它可以帮助识别和解决内存泄漏、查找大对象、分析垃圾回收行为等问题。
以下是使用MAT来导入dump文件和进行分析的基本步骤 下载和安装MAT可以从官方网站https://www.eclipse.org/mat/下载并安装适用于您操作系统的MAT版本。 导入dump文件 打开MAT工具。在欢迎界面上选择Open Heap Dump打开堆转储。在弹出窗口中选择要导入的dump文件。这可以是.hprof、.phd或IBM格式的.dump文件。单击Finish完成导入。 分析堆转储文件 在导入后MAT会花费一些时间进行分析和索引。一旦分析完成您将看到一个“Histogram”直方图视图其中显示了各个类的实例数和内存占用情况。 探索和分析数据 使用不同的视图和功能来分析内存使用情况、对象引用关系、内存泄漏等。“Dominators”支配者视图可以帮助您找到占用最多内存的对象。Leak Suspects泄漏嫌疑视图可帮助您识别潜在的内存泄漏问题。
MAT提供了许多功能和视图涵盖了广泛的堆转储分析需求。您可以通过探索菜单、工具栏和上下文菜单来查看和使用这些功能。
请注意由于堆转储文件通常很大数百MB或更大导入和分析过程可能需要一些时间和系统资源。
那么我们来整理和解决一下这些问题如何解决
这里是一个在线的JVM可调整参数的汇总网站还是比较全面的。
Java JVM 参数设置大全
以下是一份详细的JVM参数汇总 通用参数 -server选择JVM运行在服务器模式。-client选择JVM运行在客户端模式。-version打印JVM版本信息并退出。-verbose[:class|gc|jni]启用详细输出可选项为类加载、垃圾回收或JNI调试。-showversion打印JVM版本信息并继续执行。-X显示非标准选项帮助。-ea[:packagename...|:classname]启用断言检查。-da[:packagename...|:classname]禁用断言检查。 堆相关参数 -Xmxsize设置最大堆内存大小。-Xmssize设置初始堆内存大小。-Xmnsize设置新生代大小。-XX:NewSizesize设置新生代初始大小。-XX:MaxNewSizesize设置新生代最大大小。-XX:SurvivorRatioratio设置Eden区与Survivor区的比率。-XX:MaxTenuringThresholdthreshold设置对象晋升到老年代的年龄阈值。 GC垃圾回收相关参数 -XX:UseSerialGC使用串行垃圾回收器。-XX:UseParallelGC使用并行垃圾回收器。-XX:UseConcMarkSweepGC使用CMS并发标记清除垃圾回收器。-XX:UseG1GC使用G1Garbage First垃圾回收器。-XX:MaxGCPauseMillismilliseconds设置最大垃圾收集停顿时间。-XX:GCTimeRation设置垃圾回收时间与应用程序执行时间的比率。-XX:ExplicitGCInvokesConcurrent明确调用System.gc()时触发并发GC。 类加载参数 -XX:TraceClassLoading跟踪类加载过程。-XX:TraceClassUnloading跟踪类卸载过程。-XX:TraceClassResolution跟踪类解析过程。 JIT即时编译器相关参数 -XX:TieredCompilation启用分层编译。-XX:PrintCompilation输出已编译方法的日志信息。 线程相关参数 -Xsssize设置线程栈大小。-XX:ThreadStackSizesize设置线程栈大小。
接下来我将记录一下一种经常出现的问题以及它们的优化思路
在JVM在线上环境中可能会出现以下常见的报错和问题 内存相关问题 OutOfMemoryError表示JVM无法分配更多的内存可能是由于堆或永久代空间不足导致。PermGen Space错误JDK 8之前或Metaspace错误JDK 8及更高版本表示永久代JDK 8之前或元空间JDK 8及更高版本已满。这通常是因为动态生成类太多或者加载的类太多导致永久代或元空间不足。 垃圾回收相关问题 Full GC过长当垃圾回收需要大量时间时可能会导致系统停顿或性能下降。GC Overhead Limit Exceeded当垃圾回收所占用的CPU时间超过一定比例时JVM会抛出此错误。 线程相关问题 Deadlock死锁两个或多个线程相互等待对方释放资源导致程序无法继续执行。Thread starvation线程饥饿某些线程无法获得足够的CPU时间或资源导致长时间处于等待状态。 类加载问题 ClassNotFoundExceptionJVM无法找到特定的类。NoClassDefFoundError类在编译时存在但在运行时无法找到。 并发问题 Race Condition竞态条件多个线程同时访问共享资源导致数据不一致或错误。Synchronization errors同步错误使用不正确的同步机制可能导致死锁、饥饿或性能下降。 其他常见问题 StackOverflowError递归调用过深导致栈溢出。NullPointerException尝试使用空引用对象。
以上只是一些常见的问题和报错。由于JVM的复杂性和灵活性实际上可能会遇到各种其他问题和异常。解决这些问题需要详细的日志分析、监控和调优技巧。因此在生产环境中建议进行合适的监控和日志记录以便及时发现和解决潜在的问题。
上面这些问题都可以使用我前面提供的解决方案1就是使用普罗米修斯来监控预警。然后通过具体的阿尔萨斯来解决这些问题。