摘要: 对于线上系统突然产生的运行缓慢问题,如果导致线上系统不可用,首先导出jstack和内存信息,然后重启系统,尽快保证系统的可用性。 造成这种情况可能的原因主要有两种: 1.代码中某个位置读取数据量较大,导致系统内存耗尽,从而导致Full GC次数过多,系统缓慢。 2.代码中比较耗CPU的操作,导致CP 阅读全文
posted @ 2021-11-19 16:08 Sempron2800+ 阅读(459) 评论(0) 推荐(0) 编辑
摘要: Serial GC: 它是最古老的垃圾收集器, “Serial”体现在其收集工作是单线程的,并且在进行垃圾收集过程中,会进入臭名昭著的“Stop-The-World”状态。当然,其单线程设计也意味着精简的GC实现,无需维护复杂的数据结构,初始化也简单,所以一直是Client模式下JVM的默认选项。 阅读全文
posted @ 2021-11-19 15:55 Sempron2800+ 阅读(31) 评论(0) 推荐(0) 编辑
摘要: 调优的一些原则: 1.多数的java应用不需要再服务器上进行GC优化,虚拟机内部已经有很多优化来保证应用的稳定运行,不必为了调优而调优,不当调优可能适得其反。 2.在应用上线之前,先考虑将机器的JVM参数设置到最优。 3.在进行GC优化之前,需要确认项目的架构和代码等已经没有优化空间了。不能指望一个 阅读全文
posted @ 2021-11-19 15:39 Sempron2800+ 阅读(76) 评论(0) 推荐(0) 编辑
摘要: JVM的结构如图所示: 依次介绍各部分功能: 1.程序计数器(Program Counter Register)一块较小的内存空间, 属于线程私有. 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令, 分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完 阅读全文
posted @ 2021-11-19 15:06 Sempron2800+ 阅读(43) 评论(0) 推荐(0) 编辑
摘要: 虚拟机栈,本地方法栈以及程序计数器为线程隔离。方法区和堆是所有线程共享的数据区域。 方法区用于存储已被虚拟机加载的类信息、常量、静态变量、动态生成的类等数据。实际上在Java虚拟机的规范中方法区是堆中的一个逻辑部分,但是它却拥有一个叫做非堆(Non-Heap)的别名。 对于方法区的实现,不同虚拟机中 阅读全文
posted @ 2021-11-19 10:25 Sempron2800+ 阅读(744) 评论(0) 推荐(0) 编辑
摘要: 1、BootStrap类加载器 启动类加载器主要加载的是JVM自身需要的类,这个类加载使用C++语言实现。它没有父类,是虚拟机自身的一部分,它负责将<JAVA_HOME>/lib路径下的核心类库或-Xbootclasspath参数指定的路径下的jar包加载到内存中,注意虚拟机是根据文件名识别jar包 阅读全文
posted @ 2021-11-19 10:07 Sempron2800+ 阅读(102) 评论(0) 推荐(0) 编辑
摘要: 1.程序顺序规则:一个线程中的每一个操作,happens-before于该线程中的任意后续操作。 2.监视器规则:对一个锁的解锁,happens-before于随后这个锁的加锁。 3.volatile规则:对一个volatile变量的写,happens-before于任意后续一个volatile变量 阅读全文
posted @ 2021-11-19 09:57 Sempron2800+ 阅读(41) 评论(0) 推荐(0) 编辑
摘要: 垃圾回收算法: 1、引用计数法 每个对象有一个引用属性,新增一个引用时加1,引用释放时减1,计数为0得时候可以回收。 但这种计算方法无法解决循环引用的问题。 2、可达性分析算法 (1)从GCRoot开始向下搜索,搜索所走过的路径被称作引用链,当一个对象到GCRoot没有任何引用链相连时,则证明此对象 阅读全文
posted @ 2021-11-19 09:50 Sempron2800+ 阅读(117) 评论(0) 推荐(0) 编辑
摘要: JDK1.7 内部主要是一个Segment数组,而数组的每一项又是一个HashEntryh数组,元素都存在HashEntry数组里。 因为每次锁定的是Segment对象,也就是整个HashEntry数组,所以又叫分段锁。 JDK1.8 与HashMap一样采用:数组+链表/红黑树 底层原理则是采用链 阅读全文
posted @ 2021-11-19 09:42 Sempron2800+ 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 类加载过程大致分为:加载、连接(1验证 2准备 3解析)、初始化,使用和卸载都是已经加载完之后,属于类的生命周期的两个阶段。 1.类的初始化阶段,事真正开始执行类中定义的java程序代码(字节码)并按程序员的意图去初始化变量的过程,更直接的说,初始化阶段就是执行构造器<clinit>()方法的过程。 阅读全文
posted @ 2021-11-19 09:22 Sempron2800+ 阅读(97) 评论(0) 推荐(0) 编辑