jvm
文章平均质量分 68
Keep Running!
你不一定要逆风翻盘,但一定要向阳而生!
展开
-
小白日更第七十七天->关于System.gc你知道多少
关于System.gc()方法,我也去网上看了一些,感觉没怎么看懂,然后就去看了一下源码。源码:调用了Runtime.getRuntime().gc()方法这段源码中的一段注释是这么翻译的。看到这我想我们应该明白了,当我们手动调用System.gc()的时候,JVM不会立刻进行垃圾回收,而是相当于我们提醒虚拟机要进行一次垃圾回收,而具体回不回收我们还是说了不算的,因为人家源码的注释是尽最大努力回收垃圾,如果没有回收你也不要怪我啦~...原创 2021-04-15 18:16:25 · 81 阅读 · 0 评论 -
小白日更第七十六天->经典垃圾收集器之Garbage First收集器
Serial Old收集器、Parallel Old收集器、CMS收集器,这三个经典的老年代垃圾收集器,还没有看的小伙伴先建议去看一下。正文Garbage First(简称G1) 收集器是垃圾收集器技术发展历史上的里程碑式的成果, 它开创了收集器面向局部收集的设计思路和基于Region的内存布局形式。 早在JDK 7刚刚确立项目目标、 Oracle公司制定的JDK 7 RoadMap里面, G1收集器就被视作JDK 7中HotSpot虚拟机的一项重要进化特征。 从JDK6 Update 14开始就有Ea原创 2021-04-13 17:48:32 · 117 阅读 · 0 评论 -
小白日更第七十五天->经典垃圾收集器之CMS收集器
Serial Old收集器和Parallel Old收集器这两个老年代收集器还没看到小伙伴建议先看一下这两个老年代垃圾收集器。正文CMS(Concurrent Mark Sweep) 收集器是一种以获取最短回收停顿时间为目标的收集器。 目前很大一部分的Java应用集中在互联网网站或者基于浏览器的B/S系统的服务端上, 这类应用通常都会较为关注服务的响应速度, 希望系统停顿时间尽可能短, 以给用户带来良好的交互体验。 CMS收集器就非常符合这类应用的需求。从名字(包含“Mark Sweep”) 上就可以原创 2021-04-13 16:23:04 · 106 阅读 · 0 评论 -
小白日更第七十四天->经典垃圾收集器之Parallel Old收集器
上一篇中讲的老年代收集器Serial Old收集器,没看的小伙伴赶紧去看啦。正文Parallel Old是Parallel Scavenge收集器的老年代版本, 支持多线程并发收集, 基于标记-整理算法实现。 这个收集器是直到JDK 6时才开始提供的, 在此之前, 新生代的Parallel Scavenge收集器一直处于相当尴尬的状态, 原因是如果新生代选择了Parallel Scavenge收集器, 老年代除了Serial Old(PSMarkSweep) 收集器以外别无选择, 其他表现良好的老年代收原创 2021-04-13 16:06:30 · 290 阅读 · 1 评论 -
小白日更第七十三天->经典垃圾收集器之Serial Old收集器
Serial收集器、ParNew收集器、Parallel Scavenge这三款垃圾收集器都是新生代的垃圾收集器。接下来的几篇博客是关于老年代的垃圾收集器了。Serial Old是Serial收集器的老年代版本, 它同样是一个单线程收集器, 使用标记-整理算法。 这个收集器的主要意义也是供客户端模式下的HotSpot虚拟机使用。 如果在服务端模式下, 它也可能有两种用途: 一种是在JDK 5以及之前的版本中与Parallel Scavenge收集器搭配使用[1], 另外一种就是作为CMS收集器发生失败时的原创 2021-04-13 16:02:40 · 144 阅读 · 0 评论 -
小白日更第七十二天->经典垃圾收集器之Parallel Scavenge收集器
Parallel Scavenge收集器也是一款新生代收集器, 它同样是基于标记-复制算法实现的收集器, 也是能够并行收集的多线程收集器…Parallel Scavenge的诸多特性从表面上看和ParNew非常相似, 那它有什么特别之处呢?暗示着没看我Serial收集器和ParNew收集器的小伙伴赶紧去看一下啦。Parallel Scavenge收集器的特点是它的关注点与其他收集器不同, CMS等收集器的关注点是尽可能地缩短垃圾收集时用户线程的停顿时间, 而Parallel Scavenge收集器的目标原创 2021-04-13 15:52:52 · 138 阅读 · 0 评论 -
小白日更第七十一天->经典垃圾收集器之ParNew收集器
上一篇文章中已经讲过了Serial收集器,没有看的小伙伴可以先去看一下,再来学习今天要说的垃圾收集器。ParNew收集器实质上是Serial收集器的多线程并行版本, 除了同时使用多条线程进行垃圾收集之外, 其余的行为包括Serial收集器可用的所有控制参数(例如: -XX: SurvivorRatio、 -XX:PretenureSizeThreshold、 -XX: HandlePromotionFailure等) 、 收集算法、 Stop The World、 对象分配规则、 回收策略等都与Seria原创 2021-04-13 15:30:37 · 199 阅读 · 0 评论 -
小白日更第七十天->经典垃圾收集器之Serial收集器
Serial收集器是最基础、 历史最悠久的收集器, 曾经(在JDK 1.3.1之前) 是HotSpot虚拟机新生代收集器的唯一选择。 大家只看名字就能够猜到, 这个收集器是一个单线程工作的收集器, 但它的“单线程”的意义并不仅仅是说明它只会使用一个处理器或一条收集线程去完成垃圾收集工作, 更重要的是强调在它进行垃圾收集时, 必须暂停其他所有工作线程, 直到它收集结束。 “Stop The World”这个词语也许听起来很酷, 但这项工作是由虚拟机在后台自动发起和自动完成的, 在用户不可知、 不可控的情况下把原创 2021-04-13 15:18:21 · 184 阅读 · 0 评论 -
小白日更第六十九天->武林盟主:HotSpot VM
相信所有Java程序员都听说过HotSpot虚拟机, 它是Sun/OracleJDK和OpenJDK中的默认Java虚拟机, 也是目前使用范围最广的Java虚拟机。 但不一定所有人都知道的是, 这个在今天看起来“血统纯正”的虚拟机在最初并非由Sun公司所开发, 而是由一家名为“LongviewTechnologies”的小公司设计; 甚至这个虚拟机最初并非是为Java语言而研发的, 它来源于Strongtalk虚拟机, 而这款虚拟机中相当多的技术又是来源于一款为支持Self语言实现“达到C语言50%以上的执原创 2021-04-13 15:02:16 · 182 阅读 · 0 评论 -
小白日更第四十天->GC Roots的对象
关于这个问题好像查的人还不少,网上的说法也不是很统一,我直接在**<深入理解Java虚拟机:JVM高级特性与最佳实践(第3版) 周志明>**这本书中来给大家找到答案吧在Java技术体系里面, 固定可作为GC Roots的对象包括以下几种:·在虚拟机栈(栈帧中的本地变量表) 中引用的对象, 譬如各个线程被调用的方法堆栈中使用到的参数、 局部变量、 临时变量等。·在方法区中类静态属性引用的对象, 譬如Java类的引用类型静态变量。·在方法区中常量引用的对象, 譬如字符串常量池(String原创 2021-04-06 19:35:22 · 190 阅读 · 0 评论 -
小白日更第三十九天->静态变量什么时候被回收
要想真正的知道这个问题的答案,需要一点jvm的基础。静态变量什么时候分配静态变量是在类初始化之前就在方法去的静态域中分配内存空间了。静态变量在类被卸载的时候销毁。那什么时候类卸载呢?在<深入理解Java虚拟机:JVM高级特性与最佳实践(第3版) 周志明>3.2.5回收方法区中有这样几段话,供小伙伴们参考~有些人认为方法区(如HotSpot虚拟机中的元空间或者永久代) 是没有垃圾收集行为的, 《Java虚拟机规范》 中提到过可以不要求虚拟机在方法区中实现垃圾收集, 事实上也确实有未原创 2021-04-06 19:23:53 · 1298 阅读 · 0 评论 -
小白日更第三十八天->类初始化时机
什么时候会发生类的初始化1、创建类的实例,也就是new一个对象2、访问某个类或接口的静态变量,或者对该静态变量赋值3、调用类的静态方法4、反射(Class.forName(“com.qcby.***”))5、初始化一个类的子类(会首先初始化子类的父类)6、JVM启动时标明的启动类,即文件名和类名相同的那个类 测试:创建类的实例,也就是new一个对象package com.qcby.algorithm;public class Test01 { public static voi原创 2021-04-06 19:03:39 · 117 阅读 · 0 评论 -
小白日更第三十天->JVM之栈帧
关于栈我觉得还是老规矩百度百科~相信小伙伴都对栈不陌生,百度百科也已经解释的很清楚了,我也没必要废话了是不是栈帧当我们运行一个java方法的时候JVM就会在java虚拟机栈中创建一个栈帧,为什么这里强调是java方法,因为jvm中不仅有java虚拟机栈还有本地方法栈,那这个是用来干什么的呢,小伙伴们直到jvm是建立在操作系统之上的,无法直接和操作系统进行相关的操作,比如线程,学过java的小伙伴都知道Thread,并且直到new一个线程后,调用start()方法就可以启动线程了,但是线程是操作系原创 2021-03-30 16:13:11 · 95 阅读 · 0 评论 -
小白日更第九天->对象都是在堆中分配内存的吗?
最近复习JVM的时候发现一句话,99%的对象和数组都是在堆中被创建和分配内存的,我就想,那1%去哪了呢?了解过JVM的同学有思考过这个问题吗?原创 2021-03-17 15:20:30 · 191 阅读 · 4 评论