部分 垃圾回收机制简短,简单的配置

垃圾回收机制(GC)它是JVM程序和算法对这些对象的释放不再使用的内存密集型。

GC没有写java自定义标准语言,因此,不是所有的JVM有着GC。

GC的主要目的就是清除不再使用的对象。

垃圾回收的两种方法:

1.引用计数

引用计数表示一个对象被引用的全部次数,当引用计数为0时,则表示该对象没有被引用,能够将其删除。

2.对象引用树

眼下比較经常使用的垃圾收集机制是对象引用树,即将对像的引用关系构建成一棵树,从一组根对象開始。对全部对象进行查找,通过递归查找若在该树中找到对应的对象,则将该对象标记为可达的即该对象仍然被引用,否则标记该对象为不可达。

最后通过简单的堆栈扫描,删除标记为不可达的对象,释放对应的内存。

PS:假设仅仅是简单的将标记为不可达的对象删除。就会出现多个内存片段。有可能这些内存片段太小都不可用,这样就会造成内存的浪费。因此。一般是再删除对象后採用内存压缩方法将可用对象变得放在一起。空暇内存放在一起,这样就行再次利用。

要是进行内存重组,JVM须要停止其它的活动,即全部与应用程序相关的工作停止。仅仅有GC执行。这样就会产生多次程序中断。

Sun的JVM中的垃圾收集器:分代收集器

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2Vud2VuMTUzOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" align="middle">

这样的收集器将内存分为多个区域。用于存放不同寿命的对象。首先新建立的对象放在一个区域,在一段时间以后该对象还存在则将其移动到还有一个寿命更长的区域中。JVM有新域(Young Generation)、旧域(Tenured Geneartion)、永久域(Perm Generation)。JVM生成的全部新的对象放在新域中,对象经历几轮垃圾收集循环以后,便获得使用期同意进入旧域。永久域中存放的是类和方法对象。通常永久域不觉得是堆的一部分。

1.配置堆区域

堆区域:是新域和旧域之和。

设置堆的初始大小:java  -Xms128m

设置堆的最大大小:java  -Xmx128m

PS: 通常将初始堆大小和最大堆大小设置为同样的,这样就避免程序动态添加堆大小。

2.配置新域和旧域

1)设置新域初始值和最大值为64m

Java –Xms256m–Xmx256m–Xmn64m

2)使用-XX:NewSize|MaxSize设置设置新域的初始值和最大值

Java –Xms256m –Xmx256m –XX: NewSize64m –XX:MaxNewsize=64m

3)设置新域和旧域的比例

Java –Xms128m –Xmx128m–XX:NewRatio=3

堆大小为128m,新域比例为3,即新域与旧域比例为1:3。新域大小为128/4n=32m

PS: 设置了新域的大小,将堆的大小减去新域的大小即为旧域的大小。

3.配置永久域

永久域的大小默认是4M。

执行程序时。会动态调整大小以满足需求,每次调整,JVM会对堆进行一次全然的垃圾收集。

1)使用-XX:MaxPermSize来添加永久域的大小

Java –XX:MaxmPerSize=64m

2)当JVM载入类时。永久域中的对象急剧添加,从而使JVM不断调整永久域的大小。

为了避免调整,能够使用-XX:PermSize设置初始值。

Java –Xms512 –Xmx512m–Xmn128m –XX: PermSize=32m -XX: MaxPermSize=64m

4.配置新域子空间

新域有:Eden、from救助空间、to救助空间构成;Eden用于存放新建的对象。当Eden被充满时,收集器停止运行应用程序,把全部可达到的对象拷贝到当前的from救助空间中;当from救助空间被从满时,收集器则把可达到对象拷贝到to救助空间中。这样保证活动的对象在救助空间中,知道其获得进入旧域。

默认情况下,新域使用复制收集器,旧域使用标记—清除—压缩收集器。

复制收集器:堆分为两个区间,JVM新生成的对象放在一个区间,可达到的对象放在还有一个区间,从而压缩堆栈。只适用于短生命周期的对象,否则来回复制效率太低。

1)使用-XX:SurvivorRatio控制新域子空间大小

SurvivorRatio规定救助域与Eden空间的比值。

Java –Xms256m –Xmx256m–Xmn64m –XX:SurvivorRation=2

新域64m,当中Eden32m,每一个救助域16m(SurvivorRatio表示Survivor: Eden=1:2)

2)使用-XX:TargetSurvivorRatio来控制救助域之间的比例,默认是50是一个百分比。当较大的堆栈使用较低的SurvivorRatio时,应该添加TargetSurvivorRatio为80~90。以便更好的利用救助空间。用-XX:MaxTenuringThreshold能够控制上限。

样例:为了防止所有的复制所有发生。希望对象从Eden直接扩展到旧域。将MaxTenuringThreshold=0。设置完毕后实际上就不用救助域了,因此将SurvivorRation设置为最大值以最大化Eden空间

Java –Xms256m –Xmx256m–XX:MaxTenuringThreshold=0 –XX:SurvivorRatio=50000

版权声明:本文博主原创文章。博客,未经同意不得转载。

时间: 2024-08-07 00:00:59

部分 垃圾回收机制简短,简单的配置的相关文章

对CLR基本原理概念&垃圾回收机制的简单理解

PS,之前有说过C语言的函数&变量的一些基本概念,说得可能不是很好,先也把C#的.里相关的也说下,已成一统. 而说函数变量,其实主要就是GC,而GC又是CLR的主要内容,故就有了此文. CLR基本原理: 把这几个概念一说基本就知道了,其实就是为了跨语言.跨平台,和JAVA的JVM类似 1.MSIL,中间语言,就是独立于所在平台系统的.net的特殊代码.里面含有相关元数据信息,常用的反编译工具想ILspy等就是靠他吃饭的. 2.CLR,公共语言运行时,其实就是把VB.VC.C#等不同语言编译成同一

Java和.NET中的垃圾回收机制比较

相同点: 都采用了分代的机制. 都支持并发GC. 都没有采用引用计数方式,而是采用了追踪技术. .NET中,可以通过代码GC.Collect() 强制要求CLR进行垃圾回收(由于垃圾回收是异步的,CLR有一个专用的线程负责垃圾回收,因此,即使调用GC.Collect,也并不是实时的调用了Finalize,因此要保证确实调用了析构方法,可以使用语句GC.WaitForPendingFinalizers()来确保析构方法真的被运行了,参考http://cnn237111.blog.51cto.com

erlang二进制数据垃圾回收机制

erlang二进制数据在内存中有两种存在形式,当数据大小不到 64 bytes,就直接存在进程堆内.假设超过了64 bytes.就被保存到进程外的共享堆里,能够给节点内全部进程共享. erlang有两种二进制容器:heap binaries和refc binaries. heap binaries Heap binaries are small binaries, up to 64 bytes, that are stored directly on the process heap. They

掌握PHP垃圾回收机制

php的垃圾回收机制可以简单总结为 引用计数 写时复制 COW机制, 本文主要和大家分享掌握php垃圾回收机制的知识,希望能帮助到大家. 引用计数基本知识 官网的解答如下 每个php变量存在一个叫"zval"的变量容器中一个zval变量容器,除了包含变量的类型和值 ,还包括两个字节的额外信息 is_ref 和 refcount is_ref 是个bool值,用来标识这个变量是否是属于引用集合(reference set).通过这个字节,php引擎才能把普通变量和引用变量区分开来 ref

java语言及其垃圾回收机制简单概述

 一.java 语言概述 Java 语言是一门纯粹的面向对象编程语言,它吸收了c++语言的各种优点.又摈弃了c++里难以理解的多继承,指针等概念因此Java语言具有功能强大和简单易用两个特征. Java语言的几个重要概念如下: J2ME:主要用于控制移动设备和信息家电等有限存储设备 J2SE:整个java技术的核心和基础, J2EE:java技术中应用最最广泛的部分,它提供了企业应用开发相关的完整的解决方案. API: 核心类库 JRE:运行Java程序所必须的环境的集合,包含JVM标准实现及J

简单测试JVM垃圾回收机制 System.gc()方法

简单的写一个方法测试Java的垃圾回收机制 System.gc()可以提醒JVM虚拟机去进行垃圾回收了,但是不一定成功. /** * 覆写Object中的finalize()方法 */ public class LJ { @Override protected void finalize() throws Throwable { System.out.println("垃圾正在回收..........."); } } public class GCDemo { /** * @param

JVM垃圾回收机制总结(5) :JDK垃圾收集器的配置命令

以下配置主要针对分代垃圾回收算法而言. 堆大小设置 年轻代的设置很关键 JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制.32位系统下,一般限制在1.5G~2G:64为操作系统对内存无限制.在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m. 典型设置: java -Xmx3550m -Xms3550m -Xmn2g –Xss128k -Xmx3550

从几个简单的程序看PHP的垃圾回收机制

每一种计算机语言都有自己的自动垃圾回收机制,让程序员不必过分关心程序内存分配,php也不例外,但是在面向对象编程(OOP)编程中,有些对象需要显式的销毁,防止程序执行内存溢出. 一.PHP 垃圾回收机制(Garbage Collector 简称GC)永盈会娱乐城 在PHP中,没有任何变量指向这个对象时,这个对象就成为垃圾.PHP会将其在内存中销毁:这是PHP的GC垃圾处理机制,防止内存溢出.当一个PHP线程结束时,当前占用的所有内存空间都会被销毁,当前程序中所有对象同时被销毁.GC进程一般都跟着

02 java 简单了解 垃圾回收机制

程序运行时,一些分配出去的内存得不到及时回收,就会引起系统运行速度下降,甚至导出程序瘫痪,这种现象被称为内存泄漏 java 程序里的 内存分配和回收都是由 jre 在后台自定进行的, jre 会负责回收那些不在使用的内存, 这种机制被称为 垃圾回收 Garbage Collection   --GC 通常 jre 会提供一个后台线程来进行检测和控制,一般都是在 CPU 空闲或者内存不足的时候进行 垃圾回收, 而陈序员 无法精确控制垃圾回收的时间和顺序 在java 中 当没有引用变量指向原先分配给