
JVM
逆风GLORY
Stay Hungry, Stay Foolish. – Steve Jobs
展开
-
服务器OOM如何排查和解决
参考文章:https://www.cnblogs.com/c-xiaohai/p/12489336.htmltop命令显示的结果列表中,会看到%MEM这一列,这里可以看到你的进程可能对内存的使用率特别高。以查看正在运行的进程和系统负载信息,包括cpu负载、内存使用、各个进程所占系统资源使用jstat命令: jstat -gcutil 20886 1000 10 每隔一段时间显示一下,包括新生代的两个S0、s1区、Eden区,以及老年代的内存使用率,还有young gc以及full ...转载 2020-12-15 18:08:42 · 1587 阅读 · 0 评论 -
JVM实战-07·JVM调优
目录JVM调优工具如何调优线程监控内存泄漏检查常见异常调优原文地址:https://www.iteye.com/blog/pengjiaheng-552456JVM调优工具Jconsole,jProfile,VisualVMJconsole :jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用。对垃圾回收算法有很详细的跟踪。详细说明参考这里JProfiler:商业软件,需要付费。功能强大。详细说明参考这里VisualVM:JDK自带,功能强大,与JPro.转载 2020-12-13 18:21:17 · 191 阅读 · 0 评论 -
Java虚拟机对锁的优化
jdk1.6以后,JVM对 synchronized 锁进行了优化:锁消除 锁消除是 JIT编译器对synchronized 锁的优化,在编译的时候,JIT编译器会通过逃逸分析技术,来分析synchronized 锁对象,如果只可能被一个线程加锁,这个时候编译就不用加入monitorenter 和 monitorexit 的指令。锁粗化 JIT编译器发现代码里多次加锁释放锁,会给合并为一把锁。偏向锁 monitorenter 和 monitore...原创 2020-11-20 12:54:49 · 195 阅读 · 0 评论 -
synchronized底层如何保证原子性、可见性、有序性
原理原子性:加锁和释放锁;可见性:加了Load屏障和Store屏障,释放锁flush数据,加锁会refresh数据;有序性:Acquire屏障和Release屏障,保证代码块内部可以重排,但是代码块内部和代码块外部的指令是不能重排的。保证原子性java对象是分为对象头和实例变量两块,其中实例变量就是对象那些变量数据,然后对象头包含了两块内容,一是 Mark Word(含hashCode、锁数据、GC数据等),另一个是Class Metadata Address(包含了指向类的元数据指针)转载 2020-11-19 21:27:25 · 1826 阅读 · 0 评论 -
Java 程序中的指令重排
Java中有两个编译期:1、编译期:调用 javac 命令将Java代码编译成Java字节码;2、运行期:JIT 编译器将字节码编译成机器码。指令重排指令重排是指在程序执行过程中, 为了性能考虑, 编译器和CPU可能会对指令重新排序。...原创 2020-11-19 17:31:18 · 576 阅读 · 0 评论 -
进程kill不掉怎么办
问题背景:公司内部的一套发布系统,每次部署,启动git仓库所指代码,并且启动时不是直接通过java -jar 启动的,是属于发布系统内的子进程,当子进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构。导致我们在kill时不能杀掉。可通过如下方法处理ps -aux 查看进程状态,如果 STAT 是 Z,那么就是一个僵尸进程。ps -ef | grep 进程id 找到父进程id通过kill掉父进程来杀死这个进程。僵尸进原创 2020-11-19 14:19:24 · 5311 阅读 · 0 评论 -
服务器CPU100%如何排查和解决
目录1、定位耗费 cpu 的进程2、定位进程内耗费cpu 的线程3、定位那个方法导致 cpu 过高问题背景:要往 es 集群写日志,但当时 es 集群异常宕机,主线程写不进去数据抛出异常,但是异常内,又重新调用了 es 写的方法,导致死循环,线上服务器CPU负载接近100%,那么如何排查了?1、定位耗费 cpu 的进程查看进程列表:top c输入P,按照 cpu 使用率进行排序:P2、定位进程内耗费cpu 的线程查看进程内线程列表:top -Hp 1347...原创 2020-11-19 13:14:46 · 1583 阅读 · 0 评论 -
JVM实战-06·Tomcat如何设置JVM参数
1、为什么要设置JVM参数?各种环境代码运行在我们的 JVM中,Web 服务响应时间,运行稳定都与我们的 JVM 密切相关,JVM运行状态对我们 Web 服务表现正相关。2、如何进行 JVM 的设置? 找到 tomcat 在本地电脑中的安装目录,进入这个目录,然后进入bin目录中,在window环境下找到bin目录中的catalina.bat,在linux环境下找到catalina.sh。编辑该文件,找到JAVA_OPTS这个选项的位置,该参数是java启动的时候,需要的启动参数...原创 2020-11-12 11:22:07 · 682 阅读 · 2 评论 -
JVM实战-05·JVM垃圾回收器
一、基础概念并发收集:指用户线程与垃圾回收线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序线程运行于另一个CPU上。并行收集:指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态;吞吐量: 即 CPU 用于运行用户代码的时间与 CPU 总消耗时间的比值。垃圾收集器:是垃圾回收算法(标记-清除算法、复制算法、标记-整理算法、火车算法)的具体实现,不同商家、不同版本的JVM所提供的垃圾收集器可能会有很在差别。二、垃圾收集器图中展示了7种不同.原创 2020-11-12 07:26:01 · 379 阅读 · 0 评论 -
JVM实战-04·JVM垃圾回收机制
简介:当对象不在使用的时候,就需要释放内存,以供新的对象使用,此时就需要了解对象内存释放的机制。判断是否回收的方法1. 引用计数法:给对象增加一个引用计数器,每当有一个地方引用它是,计数器就+1,当引用失效时,计数器就-1,任何时刻计数器为 0 的对象就是不能再被使用的,即对象已“死”。引用计数法实现简单,判定效率也比较高,Python 语言就是采用的这种算法进行内存管理。但是,在主流的 JVM 中并没有被使用,是因为引用计数器无法解决对象循环引用的问题。2. GC Root T原创 2020-11-11 20:37:02 · 106 阅读 · 0 评论 -
JVM实战-03·JVM堆内存详解
目录JVM内存分配1. 年轻代2. 老年代3. 永久代堆内存分配过程JVM堆内存常用参数JVM内存分配1. 年轻代(或称新生代,Young、New)通常用来放新生成的对象(但不绝对,如可以通过-XX:PretenureSizeThreadshold配置将大对象直接分配在老年代)。年轻代的目标就是尽可能快速地收集掉那些生命周期短的对象。年轻代分3个区,1个Eden区,2个Survivor区(from 和 to),默认比例是8:1:1。每次只使用Eden和一个..原创 2020-11-11 17:35:10 · 186 阅读 · 0 评论 -
JVM实战-02·JVM内容
虚拟机内存中主要有堆、栈、本地方法栈、程序计数器、方法区。堆:(Java Heap)是虚拟机所管理的内存中最大的一块,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,各线程共享。栈:(Java Virtual Machine Stacks)是线程私有的,它的生命周期与线程相同。每个线程内的方法执行时,都会创建一个栈帧,栈帧内存储局部变量表,操作数栈,动态链接,方法出口等信息,1. 局部变量表存放了编译器可知的各种基本数据类型、对象引用、returnAddress类型。局..原创 2020-11-11 15:46:01 · 111 阅读 · 0 评论 -
JVM实战-01·JVM指令手册
注册登录骑着龙的羊博客园 首页 新随笔 联系 订阅 管理随笔 - 87文章 - 1评论 - 36深入JVM(一)JVM指令手册本文按照如下思维导图组织1. 栈和局部变量操作1.1 将常量压入栈的指令aconst_null 将null对象引用压入栈iconst_m1 将int类型常量-1压入栈iconst_0 将int类型常量0压入栈iconst_1 将int类型常量1压入栈iconst_2 将int类型常量2压入栈icon...转载 2020-11-11 11:08:15 · 115 阅读 · 0 评论 -
JVM是如何运行起来的
单独类: 在我们一个类中运行 main 方法,此时会自动开启一个 jvm 进程,他会默认一个main 线程,这个线程就负责执行 main 方法的代码,进而创建各种对象。tomcat服务: tomcat 服务启动,类都会加载到 jvm 中去,有工作线程来执行我们的类方法,就会创建各种对象,实现业务逻辑。...原创 2020-11-11 07:57:09 · 419 阅读 · 0 评论 -
synchronized关键字底层原理
synchronized关键字底层原理public class SynchronizedDemo { public void method() { synchronized (this) { System.out.println("synchronized操作"); } }}通过 JDK 自带的 javap 命令查看 SynchronizedDemo 类的相关字节码信息:首先切换到类的对应目录执行 javac Syn转载 2020-11-04 07:49:43 · 218 阅读 · 0 评论