jvm
文章平均质量分 68
入门小站
这个作者很懒,什么都没留下…
展开
-
jstack处理Java中CPU100%的思路流程
模拟问题代码构造一个死循环,造成CPU使用率100%。> vim InfiniteLoop.javapublic class InfiniteLoop { public static void main(String[] args) { Runnable target; Thread thread=new Thread(new Runnable() { @Override public void run原创 2021-02-09 23:52:16 · 313 阅读 · 1 评论 -
CMS垃圾收集器停顿案例
CMS垃圾收集器从jdk1.6中开始应用,是一个老年代垃圾收集器,在JVM的发展过程中扮演了重要的历史作用,jdk1.7,jdk1.8中都可以开启使用。在jdk9中已经废弃掉了。CMS垃圾收集器的重要缺点由于老年代碎片问题,在YGC的时候会发生晋升失败(promotion failures),即使老年代有足够的空间,但是仍然可能导致分配失败,因为没有足够连续的空间,从而触发Concurrent mode Failure,会发生SWT的FullGC。FullGC相比于CMS这种并发模式的GC需要更长.原创 2021-02-02 23:27:34 · 416 阅读 · 0 评论 -
JVM中8种垃圾收集器小结
JDK 发展历史JAVA 1.0,代号Oak橡树)于 1996-01-23 发行JAVA 1.11997-02-19 发行, 主要更新内容:引入 JDBC添加内部类支持引入 JAVA BEAN引入 RMI引入反射JAVA 1.2, 代号 Playground(操场)1998-12-8 发行,主要更新内容:引入集合框架对字符串常量做内存映射引入 JIT(Just In Time)编译器引入打包文件数字签名引入控制授权访问系统资源策略工具引入 JFC(Java Foun.原创 2020-12-10 17:50:17 · 252 阅读 · 0 评论 -
总结G1垃圾收集器面试题
介绍一下G1垃圾收集器G1收集器伴随JAVA9于2017-9-21发布,G1收集器兼顾低延迟和高吞吐在服务端运行,HotSpot团队期望取代CMS收集器。也就是在满足停顿时间的情况下获取最大的吞度量。有两种收集模式Young GC和Mixed GC。G1收集器将堆内存划分成大小相等的Region,新生代,老年代也就成了逻辑概念。整体上采用的是标记-整理算法,局部采用了复制算法。G1是jdk1.9的默认垃圾收集器,-XX:+UseG1GC开启G1收集器Region的类型新生代老年代未使用原创 2020-12-09 19:11:43 · 3820 阅读 · 0 评论 -
总结CMS常见面试题
谈谈对CMS的认知?CMS(concurrent mark sweep)在jdk1.5中已经开始使用了,2004年9月30日,JDK1.5发布。CMS设计的目标就是获取最低停顿时间(stop the world停顿时间),它是基于标记-清除算法实现的。常用的场景是互联网网站(对服务响应要求较高),它是一个老年代垃圾收集器,可以和Serial收集器,Parallel New收集器配合使用。当并行模式(concurrent mode failure)失败时CMS会退化成Serial Old.CMS收集器原创 2020-12-08 20:44:37 · 949 阅读 · 0 评论 -
什么是GC Roots
可达性算法中以GC Root对象为起点开始搜索。什么是GC Root对象虚拟机栈中引用的对象public class Rumenz{ public static void main(String[] args) { Rumenz a = new Rumenz(); a = null; }}a是栈帧中的本地变量,a就是GC Root,由于a=null,a与new Rumenz()对象断开了链接,所以对象会被回收。方法区类的静态成员引用的对象.原创 2020-12-07 21:53:17 · 524 阅读 · 0 评论 -
CMS收集器中两个致命的问题
CMS是一个很好的并发垃圾收集器,但是使用过程中会产生两个重要的问题。promotion failed 晋升失败concurrent mode failure 收集器无法处理浮动垃圾promotion failed 晋升失败原因该问题发生在Minor GC过程中,Survivor Space放不下转移的对象,老年代也放不下(promotion failed发生的时候老年代CMS还没有机会进行回收,又放不下转移到老年代的对象,下一步就会产生concurrent mode fialure,发生ST原创 2020-12-06 18:44:28 · 386 阅读 · 0 评论 -
Java-Parallel GC介绍
JVM 垃圾收集器发展历史JDK1.8中使用jmap -heap pid上面会出现Parallel GCjmap -heap 18378Attaching to process ID 18378, please wait...Debugger attached successfully.Server compiler detected.JVM version is 25.261-b12using thread-local object allocation.Parallel GC w原创 2020-12-05 22:26:33 · 8058 阅读 · 3 评论 -
jstack查看某个进程堆栈信息
jstack主要用来查看某个进程内线程的堆栈信息一个死锁的模拟代码package test;import java.util.concurrent.Executor;import java.util.concurrent.Executors;/** * @className: test * @description: TODO 类描述 * @author: mac * @date: 2020/12/3 **/public class test { public stat.原创 2020-12-03 22:38:01 · 1097 阅读 · 0 评论 -
jmap查询JVM堆内存
jmap命令可以获取运行中的jvm的快照,从而离线分析,检查内存泄漏,检查一些严重影响性能的大对象的创建,检查系统中最多的对象,各种对象所占用的内存大小.可以使用jmap生成Heap Dump.什么是堆Dump堆Dump是反应Java堆使用情况的内存镜像,其中主要包含系统信息,虚拟机属性,完整的线程Dump,所有类和对象的状态等。一般,在内存不足,GC异常等情况下,我们就会怀疑内存泄漏,这个时候就可以制作堆(Dump)来查询具体情况。常见的内存错误> outOfMemoryError .原创 2020-12-02 23:34:40 · 959 阅读 · 0 评论 -
jstat查看JVM的GC情况
jstat可以查看堆各部分的使用量,以及类加载的数量jstat所有的参数> jstat -optionsjstat -class pid # 显示ClassLoad相关信息jstat -compiler pid # 显示JIT编译的相关信息jstat -gc pid # 显示和gc相关的堆信息jstat -gccapacity pid # 显示各个代的容量以及使用情况jstat -gccause pid .原创 2020-11-30 22:07:59 · 290 阅读 · 0 评论 -
查看JVM运行参数jinfo命令
jinfo 是 JDK 自带的命令,可以用来查看正在运行的 java 应用程序的扩展参数,包括Java System属性和JVM命令行参数;也可以动态的修改正在运行的 JVM 一些参数。当系统崩溃时,jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息查看jvm所有参数默认值> java -XX:+PrintFlagsInitial -version查看jvm所有的参数> java -XX:+PrintFlagsFinal -version查看当前JVM运行的参.原创 2020-11-29 18:26:24 · 1966 阅读 · 0 评论 -
JVM ZGC介绍
什么是ZGCZGC收集器(Z Garbage Collector)由Oracle公司研发.2018年提交了JEP 333将ZGC提交给了OpenJDK,推动进入OpenJDK11的发布清单中。ZGC收集器是基于Region内存布局,暂时不设分代,使用读屏障,着色指针和内存多重映射等技术来实现并发的标记整理算法,以低延迟为目标的一款收集器。目标在对吞吐量影响不大的情况下,对任意大小堆收集停顿时间都控制在10ms以内的低延迟。ZGC堆内存布局与G1一样,ZGC也采用基于Region的堆内存布原创 2020-11-27 20:20:43 · 1602 阅读 · 1 评论 -
G1垃圾收集器
G1垃圾收集器简介Garbage First(简称:G1)收集器是垃圾收集器技术发展历史上的一个里程碑,它开创了收集器面向局部收集的设计思路和基于Region的内存布局形式.G1是一款主要面向服务端应用的垃圾收集器,HotSpot开发团队赋予它的期望是未来可以替换掉JDK5中发布的CMS收集器. JDK9发布之日,G1宣布取代了Parallel Scavenge加Parallel Old的组合,成为服务端模式下默认的垃圾收集器,而CMS则被声明为(Deprecate)使用的收集器.G1实现原创 2020-11-25 19:50:23 · 193 阅读 · 0 评论 -
JVM老年代垃圾收集器Serial Old和Parallel Old
Serial Old垃圾收集器老年代垃圾收集器,与Serial一样,是一个单线程垃圾收集器,不同的是用的算法不一样(标记-整理)根据老年代的特点,有人设计了标记-整理(Mark Compact)算法,标记过程和标记-清除算法一样,但是后续步骤不是直接对可回收对象进行清理,而是让存活对象向一端移动,然后清除掉边界以外的内存,如下图所示。复制算法在对象存活比较高的老年代需要复制大量的对象,效率将会贬低,如果不想浪费50%的内存,就需要有额外的空间进行分配担保,以应对对象100%都存活的极端情况,.原创 2020-11-10 21:31:13 · 457 阅读 · 0 评论 -
CMS垃圾收集器
CMS垃圾收集器收集详细步骤初始标记(Stop the world)并发标记预清理可被终止的预清理重新标记(Stop the world)并发清除并发重置初始标记标记GcRoots直接可达老年对象,新生代存活对象引用的老年代对象.整个过程在JDK1.7中是单线程的在JDK1.8中是多线程的(通过CMSParallelInitialMarkEnabled参数调整)。这个过程会导致STW。并发标记从初始标记阶段标记过的对象开始,标记其它存活对象,这个阶段垃圾回收线程和应用线程同原创 2020-11-08 20:00:28 · 190 阅读 · 0 评论 -
JVM常用新生代垃圾收集器
文章目录Serial垃圾收集器优点缺点:应用场景ParNew垃圾收集器应用场景参数Parallel scavenge垃圾收集器主要特点使用场景Serial垃圾收集器Serial是单线程垃圾回收器,当需要执行垃圾回收时,程序会暂停一切工作,然后单线程执行垃圾回收.单线程的好处就是减少上下文切换,减少系统开销.但是这种方式的缺点也很明显,在GC的过程中,会暂停程序执行. 若GC发生不频繁可以选这个. 对于新声代来说,区域比较小,停顿时间短.优点简单高效,是Client模式下默认的垃圾收集器;原创 2020-11-04 21:16:53 · 1241 阅读 · 0 评论 -
JVM垃圾回收算法标记清除和复制算法
标记清除算法当堆中的有效空间被耗尽时,JVM就会停止整个程序(也被称为stop the world),然后开始两项工作.一是:标记, 而是:清除标记遍历所有GC Roots,将所有GC Roots可达的对象都标记为存活对象.清除遍历堆中所有的对象把没有标记的对象全部清除.在程序运行期间,当堆中的可用内存被耗尽时,GC线程就会启动并停止程序,GC线程将存活的对象标记一遍,没有被标记的对象就是垃圾对象,最后这些垃圾对象会被清除掉,然后重新唤醒应用程序.程序运行时堆中对象的状态(默认原创 2020-11-01 21:31:16 · 487 阅读 · 0 评论 -
JVM判断对象是否存活
引用计数法可达性分析算法引用计数法给对象添加一个引用计数器,每当有一个地方引用,计数器就加1,当引用失效,计数器减1,计数器为0的对象没有被使用,Java中没有使用引用计数法,原因是引用计数法无法解决对象间的循环引用问题。package com.rumenz;public class Testy { public Object instance = null; public static void main(String[] args) throws Interrupte.原创 2020-10-26 23:11:58 · 270 阅读 · 0 评论 -
JAVA的对象访问定位
创建对象是为了访问对象,Java程序通过栈的引用(reference)数据来操作堆上的对象。由于reference类型在Java虚拟机规范中只规定了一个指向对象的引用。并没有规定通过该引用怎么定位,访问堆中的对象。具体需要看虚拟机的实现。两种访问方式:句柄访问直接访问句柄访问Java堆中会划分一个句柄池,reference存储的就是对象的句柄地址,而句柄中存放的是对象的实例数据和类型数据的地址信息。直接访问Java堆对象布局就必须考虑如何存放访问类型数据的相关信息,referenc原创 2020-10-23 23:41:35 · 251 阅读 · 0 评论 -
JVM内存模型
总览JVM标准中的五个组成部分方法区堆程序计数器本地方法栈虚拟机栈JDK1.7的运行时数据区永久代是方法区的实现jdk1.6之前字符串常量池在方法区jdk1.7之后字符串常量池被移动到堆区JDK1.8的运行时数据区jdk1.8去掉了永久代引入了元数据区Jdk1.7中的运行时常量池移动到元数据区元数据区存在于直接内存中为什么移除永久代方法区大小难以设定,容易发生内存溢出。永久代存放着Class相关信息,一般信息在编译期就能确定,但是如果在一些动态生成的Cl原创 2020-10-21 23:35:42 · 168 阅读 · 0 评论 -
JVM程序计数器,虚拟机栈,本地方法栈
程序计数器它记录了程序执行字节码的行号和指令,字节码解释器的工作就是改变程序计数器的值,切换下一条需要执行的指令(分支,循环,跳转,异常等)。java虚拟机是多线程通过轮流切换CPU时间片的方式实现,在同一时间内,CPU只会执行一个线程中的一个指令,为了每次切换回来都能到正确的执行位置,每个线程都会有一个独立的线程计数器,每个计数器不会相互影响,并且是线程私有的。由于不是开发者操作,所以是不会产生异常的。虚拟机栈虚拟机栈也是线程私有的,它的声明周期与线程一样(和线程同生死)。如果线程请求栈的深度原创 2020-10-19 23:26:43 · 197 阅读 · 0 评论 -
JVM常量池
Class文件常量池class文件是以字节为单位的二进制数据流,java编译器将java源码文件编译成.class字节码文件存放在磁盘上,.class中就包含文件常量池(非运行时常量池),在编译期间就确定了,.class文件遵循jvm虚拟机规范.Java源码:package com.rumenz;public class rumenz{ public Integer id=10; public String name="入门"; public final i.原创 2020-10-18 23:13:23 · 197 阅读 · 0 评论 -
Java垃圾回收jconsole分析
环境:jdk1.8+Mac+Idea为了便于观察我们设置了虚拟机的参数VM oprions,-Xms10m -Xmx10m代码案例1:新建了一个数组,向里面添加100个OutOfMemorypackage com.rumenz;import java.util.ArrayList;import java.util.List;public class OutOfMemory { public byte []one=new byte[128*1024];原创 2020-10-16 22:58:57 · 248 阅读 · 0 评论