java full gc是什么意思(Java中full gc什么意思)
其实java full gc是什么意思的问题并不复杂,但是又很多的朋友都不太了解Java中full gc什么意思,因此呢,今天小编就来为大家分享java full gc是什么意思的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!
java 怎样规避full gc
据我观察JAVA程序,一般在命令行模式下运行JAVA任务,JDK可以承受的内存上限大概是机器物理内存的1/4。
比如我的服务器是16G的内存,那么JAVA程序可以占用的最大内存是4G左右,超出就报溢出。
所以在一般程序运行中,JAVA内存逐渐从
100MB 200MB, 300...1G...2G......膨胀到4G,在这个过程中,我的循环都设置了System.gc(),偶尔有占用内存减少的时候,但是基本下降都很有限,然后过一会儿又继续上升。直到上升到4G的时候,如果此时系统没有明确的数据持续写进内存,只是大量进行新建变量,赋值,然后生命周期结束待回收的过程,系统会大量进行GC的操作,保证JAVA内存不超过4G,但我似乎感觉一旦在内存在4G上下游动的时候,JAVA程序的性能就开始走低。
所以我的理解是,GC直到不得不执行的时候才会被执行,而且效果并不好。。。。
PS,如果是8G内存的服务器,GC频繁执行是在JAVA占用内存到达2G的时候。
同不知道如何进行高效的内存回收。本来没有任何写入内存操作的程序,但是程序处理问题一大了,占有内存就很多。
gc是什么意思啊
常用的GC算法:
1)标记非活动对象
--何为非活动对象,通俗的讲,就是无引用的对象。
追踪root对象算法:深度追踪root对象,将heap中所有被引用到的root做标志,所有未被标志的对象视为非活动对象,所占用的空间视为非活动内存。
2)清理非活动对象
Copy算法:
方法:将内存分为两个区域(from space和to space)。所有的对象分配内存都分配到from space。在清理非活动对象阶段,把所有标志为活动的对象,copy到to space,之后清楚from space空间。然后互换from sapce和to space的身份。既原先的from space变成to sapce,原先的to space变成from space。每次清理,重复上述过程。
优点:copy算法不理会非活动对象,copy数量仅仅取决为活动对象的数量。并且在copy的同时,整理了heap空间,即,to space的空间使用始终是连续的,内存使用效率得到提高。
缺点:划分from space和to space,内存的使用率是1/2。
Compaction算法:
方法:在清理非活动对象阶段,删除非活动对象占用内存,并且把活动对象向heap的底部移动,直到所有的活动对象被移到heap的一侧。
优点:无须划分from sapce和to space,提高内存的使用率。并且compaction后的内存空间也是连续分配的。
缺点:该算法相对比较复杂。
sun jdk gc介绍:
在减少gc之前,先来看看来自IBM的一组统计数据:
98%的java对象,在创建之后不久就变成了非活动对象;只有2%的对象,会在长时间一直处于活动状态。
如果能对这两种对象区分对象,那么会提交GC的效率。在sun jdk gc中(具体的说,是在jdk1.4之后的版本),提出了不同生命周期的GC策略。
young generation:
生命周期很短的对象,归为young generation。由于生命周期很短,这部分对象在gc的时候,很大部分的对象已经成为非活动对象。因此针对young generation的对象,采用copy算法,只需要将少量的存活下来的对象copy到to space。存活的对象数量越少,那么copy算法的效率越高。
young generation的gc称为minor gc。经过数次minor gc,依旧存活的对象,将被移出young generation,移到tenured generation(下面将会介绍)
young generation分为:
eden:每当对象创建的时候,总是被分配在这个区域
survivor1:copy算法中的from space
survivor2:copy算法中的to sapce(备注:其中survivor1和survivor2的身份在每次minor gc后被互换)
minor gc的时候,会把eden+survivor1(2)的对象copy到survivor2(1)去。
tenured generation:
生命周期较常的对象,归入到tenured generation。一般是经过多次minor gc,还依旧存活的对象,将移入到tenured generation。(当然,在minor gc中如果存活的对象的超过survivor的容量,放不下的对象会直接移入到tenured generation)
tenured generation的gc称为major gc,就是通常说的full gc。
采用compactiion算法。由于tenured generaion区域比较大,而且通常对象生命周期都比较常,compaction需要一定时间。所以这部分的gc时间比较长。
minor gc可能引发full gc。当eden+from space的空间大于tenured generation区的剩余空间时,会引发full gc。这是悲观算法,要确保eden+from space的对象如果都存活,必须有足够的tenured generation空间存放这些对象。
Permanet Generation:
该区域比较稳定,主要用于存放classloader信息,比如类信息和method信息。
对于spring hibernate这些需要动态类型支持的框架,这个区域需要足够的空间。
这部分内容相对比较理论,可以结合jstat,jmap等命令(当然也可以使用jconsole,jprofile,gciewer等工具),观察jdk gc的情
jprofiler中的gc activity什么意思
查看GC及jvm配置的方法:
1、查看GC的工具:
JVisualVM是JDK 6 update 7之后推出的一个工具,它类似于JProfiler的工具,基于此工具可查看内存的消耗情况、线程的执行状况及程序中消耗CPU、内存的动作。
在内存分析上,JVisualVM的最大好处是可通过安装VisualGC插件来分析GC趋势、内存消耗详细状况。
VisualGC的运行如图所示。
从图中可看到各区的内存消耗状况及GC Time的图表,其提供的Histogram视图对于调优也有很大帮助。
2、查看jvm配置
jinfo-flag HeapDumpBeforeFullGC 29167#查看HeapDumpBeforeFullGC
jinfo:查看和修改JVM参数
Usage:
jinfo<option><pid>
(to connect to a running process)
where<option> is one of:
-flag<name> to print the value of the named VM flag
-flag [+|-]<name> to enable or disable the named VM flag
-flag<name>=<value> to set the named VM flag to the given value
-h|-help to print this help message
[@zw-90-156——]$ jmap 1282
Attaching to process ID 1282, please wait…
Debugger attached successfully.
Server compiler detected.
JVM version is 20.14-b01
0x0000000040000000 49K/opt/jdk1.6.0_43/bin/java
0x00000037a5600000 140K/lib64/ld-2.5.so
0x00000037a5a00000 1681K/lib64/libc-2.5.so
0x00000037a5e00000 22K/lib64/libdl-2.5.so
0x00000037a6200000 600K/lib64/libm-2.5.so
0x00000037a6600000 142K/lib64/libpthread-2.5.so
0x00000037a6e00000 52K/lib64/librt-2.5.so
0x00000037aa600000 111K/lib64/libnsl-2.5.so
0x00002aaaaaac3000 64K/opt/jdk1.6.0_43/jre/lib/amd64/libverify.so
0x00002aaaaabd2000 229K/opt/jdk1.6.0_43/jre/lib/amd64/libjava.so
0x00002aaaaad1a000 52K/lib64/libnss_files-2.5.so
0x00002aaaaaf25000 90K/opt/jdk1.6.0_43/jre/lib/amd64/libzip.so
0x00002aaaaf3d2000 38K/opt/jdk1.6.0_43/jre/lib/amd64/libmanagement.so
0x00002aaaaf4d9000 110K/opt/jdk1.6.0_43/jre/lib/amd64/libnet.so
0x00002ad21d600000 47K/opt/jdk1.6.0_43/jre/lib/amd64/jli/libjli.so
0x00002ad21d70d000 13050K/opt/jdk1.6.0_43/jre/lib/amd64/server/libjvm.so
Java中full gc什么意思
gc是垃圾回收的意思(gabage
collection),内存处理器是编程人员容易出现问题的地方,忘记或者错误的内存回收导致程序或者系统的不稳定甚至崩溃,java的gc功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,java语言没有提供释放已分配内存的俄显示操作方法。
希望能帮到你,谢谢!
如果你还想了解更多这方面的信息,记得收藏关注本站。