![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
jvm
sk8QIOng
分享记录一些自己的学习心得
展开
-
jvm - GC垃圾回收器(二) G1垃圾回收器
???G1垃圾回收器和CMS垃圾回收器有什么区别?G1横跨young old两区(证明:-XX:PrintGCDetails -XX:UseG1GC ,在输出中只能看到garbage first heap和Metaspace,看不到young、old),而CMS用于老年代;CMS采用老年代采用标记清除,而G1整体上采用标记整理,局部采用复制算法,不会产生内存碎片;在IDEA配置JVM参数:结果:只有两层,新生代+老年代被grabage-first heap一次性拿下(证明了: G.原创 2020-06-23 13:29:30 · 212 阅读 · 0 评论 -
jvm - GC垃圾回收器(一)年轻代+老年代
四种主要的垃圾回收器: *Serial(串行垃圾回收器):后台只有一个线程负责垃圾回收,当它回收时,会暂停所有用户线程,所以不适合服务器环境。(一个人打扫,其他客人都得等着) *Parallel(并行垃圾回收器):后台有多个线程负责垃圾回收,当它们回收时,同样暂停所有用户线程,适用于科学计算/大数据处理等若交互场景。(一堆人打扫,客人都得等着) *CMS(并发标记清除,简称 并发垃圾回收器):(它其实分4步,有两步其实还是会暂停一下,但效率已经高很多了)(边吃边打扫)...原创 2020-06-23 13:24:13 · 1560 阅读 · 1 评论 -
jvm - 强引用、软引用、弱引用(涉及WeakHashMap)、虚引用(涉及ReferenceQueue)垃圾回收时机
引用的架构图:Reference在java.lang.ref包下1、强引用(默认)将对象赋值给以引用变量,这个引用变量就是一个强引用,这个强引用指向的对象即使出现了OOM也不会被回收。代码举例:obj2也是强引用,所以即使obj不再指向new Object()对象了,但是该对象依旧不会被GC2、软引用SoftReference softReference = new SoftReference<>(new Object());适用于对内存敏感的..原创 2020-06-18 15:48:45 · 394 阅读 · 0 评论 -
jvm - GC roots & 参数调优与命令
什么是垃圾:内存中不再被使用到的空间。如何确定是不是垃圾:引用计数法、用枚举根节点做可达性分析。枚举根节点是一系列名为GC roots的对象集合(一组活跃的引用),作为起始点,它们下面连着的叫引用可达对象,没连着的叫引用不可达对象。哪些对象属于GC root Set?(???字符串常量池在方法区中吗)(jdk1.6的时候还在(此时为永久代))(jdk1.7,字符串常量池被移动到了堆中)代码举例:new GCRootDemo()就是虚拟机栈(栈中的本地变量表)中引用的对象;pr..原创 2020-06-18 12:47:33 · 300 阅读 · 0 评论 -
jvm - gc回收算法之 引用计数法、复制、标记清除、标记压缩 & Minor GC 和 Full GC的差别与调用时机
GC是什么(分代收集算法):1.在次数上,频繁地收集Young区:2.在次数上,较少地收集Old区:3.基本不动Perm区(元空间):GC4大回收算法:1、引用计数法(了解即可)(JVM的实现一般不采用这种方式。)给每个对象一个计数器,减到0的时候,回收。循环引用的举例:2、复制算法(Copying)(常见常用)(年轻代使用YGC或者说Minor GC进行垃圾回收,这种回收方式本质调用了复制算法)(即年轻代GC使用复制算法,复制算法不会产生内存碎片)把伊甸园.原创 2020-06-17 23:31:56 · 380 阅读 · 0 评论 -
jvm - jvm堆参数调优 & OutOfMemoryError的dmeo
堆参数的调优(我们说JVM调优,其本质就是对参数的调优)在jdk1.7下(已过时):其中:1)-Xms:start(默认为1/64,)2)-Xmx:max (默认为1/4,即默认堆的最大值是物理内存的1/4)堆的初始大小和最大值,两者最好一致,避免内存大小调整影响运行的性能3)-Xmn:new之前学过堆物理上,新生代和老年代的比例为1:2所以想要修改这个比例,就是调整 -Xmn 的大小,但是这个参数,一般不调。下面两个参数一辈子用不上,因为jdk1.8取消了永久原创 2020-06-17 23:27:06 · 182 阅读 · 0 评论 -
jvm - 堆的新生代和老年代 & 年轻代gc回收过程 & OutOfMemoryError & 永久代和元空间关系 & 字符串常量池在不同jdk版本的位置
堆(Heap)在jdk1.7以前:jdk1.8:永久区变成了元空间堆在物理上分为:新生+养老(真正干活的就这两个)讲一下堆中物理划分出两个:新生区+养老区:(真正干活的就这两个)新生区中伊甸区的GC称为Minor GC;养老区的GC称为Major GC(Full GC);堆从物理上分为新生区+养老区(真正干活的就这两个)伊甸区的GC又可以称为YGC;1.伊甸区满了(假设100个),需要GC,GC之后存活的对象,不会留在伊甸区,而是进入幸存者0区-S0-F..原创 2020-06-17 23:21:10 · 748 阅读 · 0 评论 -
jvm - 栈发生StackOverflowError的demo & HotSpot与jvm关系 & 句柄池原理
会导致栈溢出StackOverflowError它是一种错误,不是异常:(OutOfMemoryError也是错误)OutOfMemoryError和StackOverflowError都属于VirtualMachineError的一种下面讲一下方法区、栈、堆三者的关系:1.HotSpot是sun公司创建的JVM;(我们学习及使用的JVM,一般都是指sun公司创建的这个HotSpot)(所以引用通过指针,指向访问对象,没什么好解释的了)其它公司也可以自己创建一种jvm,取其...原创 2020-06-17 23:16:41 · 208 阅读 · 0 评论 -
jvm - 体系结构 & 本地方法接口 & pc寄存器 & 方法区 &栈
线程是操作系统级别的,不是语言级别的。因为Java语言中new Thread().start()中,其本质调用了一个native方法:start0();native方法:调用的是和Java无关的底层的操作系统库或者C语言函数库。本地方法接口(Native Interface)由于栈中存放方法,所以栈分了两类:Java栈(又叫虚拟机栈)、本地方法栈(Native Method Stack)(里面存放native方法)本地方法栈:本地方法接口在本地方法栈中登记标记为native...原创 2020-06-17 23:13:37 · 138 阅读 · 0 评论 -
jvm - 初步了解JVM体系结构 & 类装载器 & 双亲委派机制和沙箱安全
JVM的体系结构图:(橙色+灰色)灰色:线程私有(即每个线程对应一个)、内存占的特别少,几乎不存在垃圾回收Execution执行引擎:解释命令,交由操作系统执行本地方法接口:设计的目的就是融合不同的语言为Java所用。(本地方法接口在本地方法栈中登记标记为native的方法,当执行引擎执行时,本地方法接口调用native方法库)(即本地方法接口是本地方法栈、执行引擎、本地方法库的中心)方法区不是放方法的区,是放类的描述信息,即放模板的地方。类装载器不唯一,有几种,类不同,类装载.原创 2020-06-17 23:08:49 · 119 阅读 · 0 评论