当前位置:首页 > 虚拟机 > 正文

深入理解jvm虚拟机 pdf(深入理解jvm虚拟机第三版电子书)

说说JVM常用垃圾回收器的特点、优劣势、使用场景和参数设置

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虚拟机的知识就像是公式的推导过程。掌握数学公式固然可以帮助你在考试中取得好成绩,但了解其背后的推导过程对于记忆和理解更有用。而且当我们遇到没有公式的情况时,我们也能知道如何解决。