`
xielingjiang
  • 浏览: 33953 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Java基础在学习之虚拟机内存模型和GC

阅读更多
http://www.iteye.com/topic/802638

仔细阅读完上面的文章,我有如下总结:
jvm内存模型是什么
不了解内存,而已去内存垃圾收集?
查资料发现主要是三大块:新生代,老生代,永久代。
很好理解,就是根据对象的变化频率划分的。

什么是GC
Garbage Collection,很好理解,就是把不要的对象移除出内存。
为什么要GC
很简单,因为内存对于现在的计算机来说还算是稀缺资源,所以要整理一些垃圾数据。
什么时候GC
不看实现,如果让我实现,无非如下几种情况:
1.空间满了。
2.时间空闲了。
3.外部告诉JVM强制垃圾收集,比如system.gc()。
怎么样GC
好了,这个是本文的重点,而怎么样做垃圾收集关键点又是什么呢?很容易想到就是怎么判断哪些对象应该垃圾收集以及怎么做垃圾收集最快最省力。
第一个关键点:怎么判断哪些垃圾收集?有人想到了一个简单实现,那就是引用计数法,如果引用一个对象就把这个对象的引用数+1,如果取消一个对象的引用就把这个对象的引用数-1。好了,如果引用数如果为0,那么我们说这个对象应该被垃圾收集。
当然,我想这个算法是很简洁易懂,但是并不完美。对于局部循环引用的的情况下,那两个对象会抱团存活(互相引用)。而这不是我们想要的。我们需要一并清理这些作假者。
基于如上问题,人们想到了另外一种实现,那就是根搜索算法,可以这么说,任何引用其他对象的引用都可以找到源头的一个对象,因此可以得出一个引用链,我们只要记录这个根引用的集合。所以,如果一个对象的任何引用追溯到根节点都不在根引用集合里面,那么即使这个对象即使被不是根引用的对象引用着也是可以被垃圾回收的。
第二个关键点:怎么保证垃圾收集又快又省力?也就是高效
有人想到了如下算法,内存分成两半,一半用于工作内存,另外一半不用,这样,如果其中工作内存满了的时候就进行一次垃圾收集,收集的方式就是把这个满的一半中还存活的对象拷贝到另一半中就可以了,这个方法可以说是简单明了,速度很快,因为只是单纯的拷贝。
这个算法很高效但是不是很完美,首先很明显内存浪费了,因为有一半没有被利用。
于是人们想到了能否改变一下分配比例?比如不是1:1,而是8:2之类的。
据IBM调查发现新生代的对象是98%都是很快需要垃圾收集的。(证据需要考证)
因此人们把内存块划分为8(eden):1(survivor):1(survivor),这样平时用到eden区和一个survivor区。到内存满的时候拷贝到另外一个survivor里面,然后把其他的空间清理掉,然后进入下一个eden+survivor的工作模式。
上面两种算法都可以叫做mark-copy算法。
这似乎很好的解决了空间利用率的问题,但是我们看到有个前提就是对象98%需要垃圾收集。
对于那些需要垃圾收集的对象比例不高的情况下,这个复制算法就显得效率低下了。
因此人们想到了非全拷贝的算法。那就是mark-compact算法。
它的原理很简单,就是在垃圾收集的时候把还存活的对象往一端移动,尽量堆在一起,去掉内存碎片,然后把边界以外的内存空间清理掉就行了。
这个对于老生代或者持久代来说是很好的,因为,要拷贝的对象很少。所以代价最小,速度很高。
基于以上两种算法,现在商业jvm就把上述三种内存模式又细分为六种情况。
总体来说也就是三类:
串行收集(但CPU)
并行收集(多CPU)
并发收集(stop the world时间最小,实时性要求高)


总结
基于以上理解回过头来看看jvm的参数就很容易理解了。
堆设置
-Xms:初始堆大小
-Xmx:最大堆大小
-XX:NewSize=n:设置年轻代大小
-XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
-XX:MaxPermSize=n:设置持久代大小

收集器设置
-XX:+UseSerialGC:设置串行收集器
-XX:+UseParallelGC:设置并行收集器
-XX:+UseParalledlOldGC:设置并行年老代收集器
-XX:+UseConcMarkSweepGC:设置并发收集器
垃圾回收统计信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
并行收集器设置
-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
并发收集器设置
-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。
0
0
分享到:
评论

相关推荐

    深入理解Java 虚拟机内存模型.rar

    Java虚拟机(JVM)内存模型是Java编程语言的核心组成部分,它定义了程序运行时的数据区域和内存管理方式。深入理解这一模型对于优化Java应用程序性能、避免内存泄漏以及理解线程安全至关重要。以下是对Java虚拟机...

    基于Java虚拟机内存模型的性能调优方法.zip

    本篇文章将深入探讨基于Java虚拟机内存模型的性能调优方法,帮助开发者优化应用程序,提高系统效率。 1. **Java内存模型** Java内存模型,也称为JVM内存结构,主要包括堆内存、栈内存、方法区、程序计数器和本地...

    Java虚拟机内存区域模型

    Java虚拟机内存区域模型是Java虚拟机管理的内存区域模型,该模型将内存区域分为程序计数器、虚拟机栈、本地方法栈、堆和方法区五个部分。程序计数器是一块较小的内存空间,用于记录当前线程执行的字节码指令地址。...

    虚拟机内存模型

    虚拟机内存模型是计算机科学中的一个重要概念,尤其是在Java和许多其他高级编程语言中。它描述了虚拟机如何管理和使用内存,以确保程序的正确运行。本文将深入探讨虚拟机内存模型的基本结构、功能以及相关工具的使用...

    Java虚拟机内存管理总结

    Java虚拟机(JVM)中的内存管理是指Java语言中对象的分配和释放问题。Java中的内存管理可以分为两部分:对象的分配和释放。 对象的分配是由程序完成的,程序员需要通过关键字new为每个对象申请内存空间(基本类型...

    30+个视频+深入理解Java虚拟机(jvm优化+内存模型+虚拟机原理)

    根据提供的文件标题、描述、标签以及部分内容,我们可以深入探讨与...通过以上介绍,我们不仅深入了解了Java虚拟机的基础知识,还学习到了如何对其进行优化和调整以提高应用程序性能。希望这些知识点能对你有所帮助!

    基于Java虚拟机内存模型的性能调优方法.pdf

    在当前IT技术发展的浪潮中,Java虚拟机(JVM)作为应用最广泛的平台之一,其性能调优显得尤为重要。Java程序因其跨平台特性,在各类软硬件环境中得以广泛运用。然而,伴随着业务量的增大和高并发运行的需求,Java...

    Java虚拟机学习资料

    "深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)-周志明"这本书提供了对JVM的深入解析,包括内存管理、垃圾收集、性能优化等多个方面,是学习和提升JVM技能的重要资源。无论你是Java新手还是经验丰富的开发者...

    java虚拟机基础ppt

    本PPT着重讲解了Java虚拟机的基础知识,包括其工作原理、内存模型、类加载机制以及垃圾收集等方面。 首先,JVM的工作原理可以概括为以下几个步骤:编译、加载、验证、准备、解析、初始化和运行。Java源代码被编译成...

    Java虚拟机规范 深入java虚拟机

    《Inside Java Virtual Machine》和《深入java虚拟机》等书籍提供了详细的技术解析,结合英文和中文版本的学习,可以更全面地理解JVM的内部运作。通过阅读这些资料,开发者不仅能掌握JVM的基本原理,还能学习如何...

    实战java虚拟机

    Java的内存分为堆内存和栈内存。堆内存主要用于存放对象实例,而栈内存则保存基本类型和引用。垃圾收集机制是Java内存管理的一大特色,它自动回收不再使用的对象所占用的内存,避免了程序员手动管理内存的繁琐。了解...

    Java 虚拟机面试题全面解析(干货)

    在了解JVM内存模型的基础上,我们进一步探讨垃圾收集(GC)的机制。JVM的垃圾收集机制包括标记-清除算法、复制算法、标记-整理算法以及分代收集算法等。垃圾收集主要是为了回收不再使用的对象,释放内存空间,其中分...

    Java虚拟机内存测试和参数调优代码.zip

    Java虚拟机(JVM)是Java程序运行的基础,它负责解释和执行字节码,管理内存,以及执行垃圾收集。本资源"Java虚拟机内存测试和参数调优代码.zip"显然是一个专注于Java开发者如何理解和优化JVM内存配置的实践教程。在...

    java虚拟机学习

    总结来说,"Java虚拟机学习"资料会带你深入了解JVM的工作原理,掌握JMM如何保证并发安全,理解类加载的全过程,以及如何利用和优化GC机制。这些知识不仅有助于提升代码质量,也能为解决实际开发中的性能问题提供理论...

    java虚拟机的两本书

    这两本书,《深入Java虚拟机》和《Java虚拟机第二版》,是深入理解JVM内部工作原理的重要参考资料。 《深入Java虚拟机》通常包含了JVM的详细剖析,涵盖了诸如类加载机制、字节码执行、内存管理、垃圾收集、性能优化...

    java深度历险+深入java虚拟机

    《Java深度历险》与《深入Java虚拟机》是两本深受Java开发者喜爱的经典书籍,它们涵盖了Java编程语言和Java虚拟机(JVM)的高级主题,旨在帮助读者深入理解Java平台的工作原理。 《Java深度历险》这本书通常会涵盖...

    java 虚拟机 教程 pdf

    总的来说,掌握Java虚拟机不仅有助于编写更高效的代码,也是解决运行时问题和优化性能的基础。通过深入学习JVM,Java程序员能够更好地理解程序的运行机制,从而编写出更健壮、性能更优的软件。这份PDF教程将是你深入...

    2_Java虚拟机( 内存结构).pdf

    Java虚拟机(JVM)是一种能够运行Java字节码的虚拟机。它不仅可以运行Java语言编写的程序,还能够运行任何编译后符合JVM规范的其他语言的字节码。JVM由三个主要子系统构成:类加载子系统、运行时数据区、执行引擎。...

    Java虚拟机规范(Java_SE_7).rar_JAVA 虚拟机规范_JAVA虚拟机

    理解和掌握Java虚拟机规范对于开发高效、稳定的Java应用至关重要,它涵盖了语言特性的底层实现,也是解决性能问题和调试故障的基础。通过深入学习JVM,开发者能够更好地优化代码,提升程序运行效率。

    java虚拟机jvm及Tomcat中的jvm有关内存的设置与调优

    ### Java虚拟机(JVM)内存设置与调优详解 #### 引言 在现代软件开发中,Java虚拟机(JVM)作为执行Java字节码的核心组件,其性能直接影响到Java应用的运行效率与稳定性。特别是在大数据处理场景下,合理设置JVM内存...

Global site tag (gtag.js) - Google Analytics