Java中的垃圾回收器几乎是面试的必考点。无论你面试的是初级、中级还是高级,你都不可避免地要问一些关于垃圾收集器的知识点。不管你在实际开发中使用了多少,还是需要对它有更深入的了解,才能在面试时不被打折扣。
本文简要介绍了JVM中常用的几种垃圾收集器的主要特性、使用场景以及优化建议。我希望它能作为一个起点并帮助您开始。
新生代收集器
老一代收集器
新生代和老一代收集器
系列收集器是最基本、最古老的收集器正在开发中。在JDK1.3.1之前,它是HotSpot新一代集合的唯一选择。
操作图
具有以下特点:
简单有效。因为与其他类型的收集器相比,它采用单线程的方式,对于单CPU来说没有上下文之间的切换,所以效率比较高。
在用户不知情的情况下停止所有工作线程。
在用户的桌面应用场景中,可用内存通常不大,垃圾回收可以在短时间内完成。只要不频繁发生,这是可以接受的
对于限制,对于单CPU环境,串行收集器没有线程切换开销,可以达到最高的单线程收集效率
操作图
多线程版本的Serial可以更有效地利用系统资源
和Serial一样,所有工作都会在没有用户的情况下停止了解Threads
在Server模式下使用,亮点是除了Serial之外,它是目前唯一可以与CMS收集器配合使用的,是一种非常重要的垃圾收集器。
操作图
具有以下特点:
尝试高吞吐量,有效利用CPU,优先处理吞吐量并实现精确控制。
根据相关特性,我们可以很容易地想到使用场景,即:当应用程序运行在多个CPU上且对暂停时间没有特别高的要求时,程序主要在以下位置进行计算:它特别适合ParNew——收集器,不需要与用户进行太多交互。
SerialOld是Serial收集器的老一代版本。它也是一个单线程收集器并使用标记整理算法。
它具有以下特点:
优点和缺点与Serial基本相同。它是一个老年代收集器,与串行收集器一起使用。
CMS(ConcurrentMarkSweep)收集器是一个旨在实现尽可能短的恢复停顿的收集器。采用的算法是“记-清除”,运算过程分为四步:
运算图
它有以下特点:
对于例如,服务器上常见的WEB、B/S系统应用。
ParallelOld是旧版本的ParallelScavenge收集器。它使用多线程和“标记排序”算法来利用多核CPU的计算能力。
它具有以下属性:
有关优缺点,请参阅ParallelScavenge收集器。
因此,在注重吞吐量、对CPU资源敏感的场景下,它是ParallelScavenge(新一代)和ParallelOld(老年代)收集器的“神奇”应用组合;
G1(Garbage-First)是JDK7-u4推出的商业收集器
它具有以下特点:
G1收集器是当今收集器技术发展最具突破性的成果。
G1需要一个内存集(具体是卡表)来记录新生代和老年代的引用关系。这种数据结构在G1中需要大量的内存,可以达到满堆内存容量的20%或更多。此外,维护G1中的内存集的成本较高,这会产生较高的执行负载并影响效率。
据《深入理解Java虚拟机》作者介绍,CMS在小内存应用中表现优于G1,而G1在大内存应用中更有优势。大内存和小内存的限制是6GB到8GB。
我个人认为G1基本完全压制了cms、并行这样的回收商。上面列出了缺点。但如果不追求极致性能,基本可以引入无脑G1。关于垃圾收集器有很多基本知识点保持不变。如果你学了(懂了),N年的相关知识就可以应对面试了。,是另一个高频面试测试网站,在这方面还是值得花点功夫的。文章如有不足或错误,欢迎指出,共同进步!
详解JVM内存结构组成你了解JVM内存结构吗?下面我给大家分享一下JVM内存结构。它主要包括两个子系统和两个组件。这两个组件就是Runtimedataarea(运行时数据区)组件和Nativeinterface(本地接口)组件
JVM内存结构
最近看一些Java内存泄漏的案例,和我的几个老朋友讨论过这些问题。经过深入研究,我发现JVM中还有很多以前不知道的细节。以下是一些细节。要分析的话,首先看一下JVM的内部结构——
如,JVM内存结构主要包括两个子系统和两个组件。两个子系统是Classloader子系统和Executionengine(执行引擎)子系统的两个组件是Runtimedataarea(运行时数据区)组件和Nativeinterface(本地接口)组件
Classloader子系统的作用
根据给定的完全限定类名(如javalangObject)将类文件的内容加载到RuntimeDataarea中的methododarea(方法区)中。Java程序员可以扩展javalangClassLoader类来编写自己的Classloader
执行引擎子系统的作用
执行类中的指令。任何JVM规范实现(JDK)的核心都是执行引擎。不同的JDK,比如Sun的JDK和IBM的JDK,其好坏主要取决于它们实现的Executionengine。好与坏
原生接口组件
与原生库交互是其他编程语言交互的接口。当调用原生方法时,你就进入了一个不再受虚拟机限制的新世界。所以也很容易出现JVM无法控制的原生heapOutOfMemory
RuntimeDataArea组件
这就是我们常说的JVM内存,主要分为五个部分——--
Heap(堆)Java虚拟实例中只有一个堆空间
MethodArea(方法区)加载的类的信息存储在Methodarea的内存中。当虚拟机加载某种类型时,会使用该类加载器定位对应的类文件,然后读取该类文件的内容并传输给虚拟机
JavaStack(java栈)虚拟机器只会以帧为单位直接在Javastack上执行两个操作。压入或弹出堆栈
ProgramCounter(程序计数器)每个线程都有自己的PC寄存器。线程启动时创建的PC寄存器的内容总是指向下一条要执行的指令。地址这里的地址可以是本地指针,也可以是方法区中方法起始指令对应的偏移量
Nativemethodstack(本地方法栈)保存的是进入该区域的native方法的地址
lishixinzhi/Article/program/Java/hx/201311/26038
JAVA开发工程师必须懂什么javaNetty实战课程Java高性能分布式RPC教程课程免费下载
链接:
为什么要学习java虚拟机的使用?随着互联网编程和开发行业的不断发展,越来越多的编程开发语言被程序员掌握。今天昌平Java培训就来看看Java虚拟机在学习Java编程开发语言时的作用。
程序员之间的语言这不是有争议的案件。写系统语言的人鄙视托管语言的低执行效率;那些编写托管语言的人取笑系统语言中手动内存管理的需要;写动态语言的人鄙视静态语言的冗余系统;那些编写静态语言的人嘲笑动态语言的内部各种奇怪的运行时错误。
Java作为一门应用广泛的语言,自然吸引了很多攻击。作为一名Java程序员,您可能已经输掉了文字之战。他们没有足够的知识来武装自己,或者也许他们想深入学习Java语言但不知道从哪里开始。在实践中,我什至对Java的启动性能和内存消感到震惊,因此对Java语言本身产生了各种怀疑和担忧。
不过不用担心,学习Java虚拟机可以解答你对Java的所有疑惑并“知其所以然”——了解Java程序是怎么回事执行并优化。这样,你就可以从内部开始,实现有效的编程。同时,也可以为学习更深入、更核心的Java技术打下坚实的基础。
如果我们把核心类库的API比作一个数学公式的话,那么Java虚拟机的知识就像是公式的推导过程。掌握数学公式固然可以帮助你在考试中取得好成绩,但了解其背后的推导过程对于记忆和理解更有用。而且当我们遇到没有公式的情况时,我们也能知道如何解决。
上一篇:深入jvm虚拟机pdf
下一篇:深入理解jvm虚拟机第三版pdf