java代码gc java代码改了不起作用

Java垃圾回收:GC在什么时候对什么做了什么1、首先,GC又分为minor GC 和 Full GC(major GC) 。Java堆内存分为新生代和老年代,新生代中又分为1个eden区和两个Survior区域 。
2、一般情况下 , 新创建的对象都会被分配到eden区 , 这些对象经过一个minor gc后仍然存活将会被移动到Survior区域中,对象在Survior中没熬过一个Minor GC,年龄就会增加一岁 , 当他的年龄到达一定程度时 , 就会被移动到老年代中 。
3、当eden区满时,还存活的对象将被复制到survior区,当一个survior区满时,此区域的存活对象将被复制到另外一个survior区,当另外一个也满了的时候,从前一个Survior区复制过来的并且此时还存活的对象,将可能被复制到老年代 。因为年轻代中的对象基本都是朝生夕死(80%以上),所以年轻代的垃圾回收算法使用的是复制算法,复制算法的基本思想是将内存分为两块,每次只有其中一块,当这一块内存使用完,就将还活着的对象复制到另一块上面 。复制算法不会产生内存碎片 。
4、在GC开始的时候,对象只会存在于eden区,和名为“From”的Survior区,Survior区“to”是空的 。紧接着GCeden区中所有存活的对象都会被复制到“To”,而在from区中,仍存活的对象会根据他们的年龄值来决定去向,年龄到达一定只的对象会被复制到老年代,没有到达的对象会被复制到to survior中,经过这次gc后,eden区和fromsurvior区已经被清空 。这个时候,from和to会交换他们的角色 , 也就是新的to就是上次GC前的fromMinor GC:从年轻代回收内存 。
5、当jvm无法为一个新的对象分配空间时会触发Minor GC,比如当Eden区满了 。当内存池被填满的时候,其中的内容全部会被复制 , 指针会从0开始跟踪空闲内存 。Eden和Survior区不存在内存碎片写指针总是停留在所使用内存池的顶部 。执行minor操作时不会影响到永久代 , 从永久带到年轻代的引用被当成GC roots,从年轻代到永久代的引用在标记阶段被直接忽略掉(永久代用来存放java的类信息) 。如果eden区域中大部分对象被认为是垃圾,永远也不会复制到Survior区域或者老年代空间 。如果正好相反,eden区域大部分新生对象不符合GC条件,Minor GC执行时暂停的线程时间将会长很多 。Minor may call "stop the world" 。
java中GC是什么?为什么要有GC?GC是垃圾回收的意思(gabage collection),内存处理器是编程人员容易出现问题的地方,忘记或者错误的内存回收导致程序或者系统的不稳定甚至崩溃 , java的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,java语言没有提供释放已分配内存的俄显示操作方法 。
希望能帮到你,谢谢!
java中GC指的是什么?gc是指垃圾回收机制,当一个对象不能再被后续程序所引用到时,这个对象所占用的内存空间就没有存在的意义了,java虚拟机会不定时的去检测内存中这样的对象 , 然后回收这块内存空间 。
GC的基本原理:
对于程序员来说,用new关键字即在堆中分配了内存,我们称之为“可达” 。对于GC来说,只要所有被引用的对象为null时 , 我们称之为“不可达”,就将进行内存的回收 。
当一个对象被创建时,GC开始监控这个对象的大小、内存地址及使用情况 。GC采用有向图的方式记录和管理堆(heap)中的所有对象 , 通过这种方式可以明确哪些对象是可达的,哪些不是 。当确定为不可达时,则对其进行回收 。
保证GC在不同平台的实现问题 , java规范对其很多行为没有进行严格的规定 。对于采用什么算法,什么时候进行回收等 。
如何查看 java gc 类型Java中的GC有哪几种类型?
参数
描述
UseSerialGC
虚拟机运行在Client模式的默认值,打开此开关参数后 ,
使用Serial Serial Old收集器组合进行垃圾收集 。
UseParNewGC
打开此开关参数后,使用ParNew Serial Old收集器组合进行垃圾收集 。
UseConcMarkSweepGC
打开此开关参数后,使用ParNew CMS Serial Old收集器组合进行垃圾收集 。Serial Old作为CMS收集器出现Concurrent Mode Failure的备用垃圾收集器 。
UseParallelGC
虚拟机运行在Server模式的默认值 , 打开此开关参数后,使用Parallel Scavenge Serial Old收集器组合进行垃圾收集 。
UseParallelOldGC
打开此开关参数后,使用Parallel Scavenge Parallel Old收集器组合进行垃圾收集 。
在Java程序启动完成后,通过jps观察进程来查询到当前运行的java进程,使用
jinfo –flag UseSerialGC 进程
的方式可以定位其使用的gc策略 , 因为这些参数都是boolean型的常量,如果使用该种gc策略会出现+号,否则-号 。
使用-XX: 上述GC策略可以开启对应的GC策略 。
GC日志查看
可以通过在java命令种加入参数来指定对应的gc类型,打印gc日志信息并输出至文件等策略 。
【java代码gc java代码改了不起作用】GC的日志是以替换的方式()写入的 , 而不是追加(),如果下次写入到同一个文件中的话,以前的GC内容会被清空 。
对应的参数列表
-XX: PrintGC 输出GC日志
-XX: PrintGCDetails 输出GC的详细日志
-XX: PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
-XX: PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234 0800)
-XX: PrintHeapAtGC 在进行GC的前后打印出堆的信息
-Xloggc:../logs/gc.log 日志文件的输出路径
这里使用如下的参数来进行日志的打?。?
-XX: PrintGCDateStamps -XX: PrintGCDetails -Xloggc:./gclogs
对于新生代回收的一行日志,其基本内容如下:
2014-07-18T16:02:17.606 0800: 611.633: [GC 611.633: [DefNew: 843458K-2K(948864K), 0.0059180 secs] 2186589K-1343132K(3057292K), 0.0059490 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
其含义大概如下:
2014-07-18T16:02:17.606 0800(当前时间戳): 611.633(时间戳): [GC(表示Young GC) 611.633: [DefNew(单线程Serial年轻代GC): 843458K(年轻代垃圾回收前的大?。?2K(年轻代回收后的大?。?948864K(年轻代总大?。?, 0.0059180 secs(本次回收的时间)] 2186589K(整个堆回收前的大?。?1343132K(整个堆回收后的大?。?3057292K(堆总大?。?, 0.0059490 secs(回收时间)] [Times: user=0.00(用户耗时) sys=0.00(系统耗时), real=0.00 secs(实际耗时)]
老年代回收的日志如下:
2014-07-18T16:19:16.794 0800: 1630.821: [GC 1630.821: [DefNew: 1005567K-111679K(1005568K), 0.9152360 secs]1631.736: [Tenured:
2573912K-1340650K(2574068K), 1.8511050 secs] 3122548K-1340650K(3579636K), [Perm : 17882K-17882K(21248K)], 2.7854350 secs] [Times: user=2.57 sys=0.22, real=2.79 secs]
gc日志中的最后貌似是系统运行完成前的快照:
Heap
def new generationtotal 1005568K, used 111158K [0x00000006fae00000, 0x000000073f110000, 0x0000000750350000)
eden space 893888K,12% used [0x00000006fae00000, 0x0000000701710e90, 0x00000007316f0000)
from space 111680K,3% used [0x0000000738400000, 0x000000073877c9b0, 0x000000073f110000)
tospace 111680K,0% used [0x00000007316f0000, 0x00000007316f0000, 0x0000000738400000)
tenured generationtotal 2234420K, used 1347671K [0x0000000750350000, 0x00000007d895d000, 0x00000007fae00000)
the space 2234420K,60% used [0x0000000750350000, 0x00000007a2765cb8, 0x00000007a2765e00, 0x00000007d895d000)
compacting perm gentotal 21248K, used 17994K [0x00000007fae00000, 0x00000007fc2c0000, 0x0000000800000000)
the space 21248K,84% used [0x00000007fae00000, 0x00000007fbf92a50, 0x00000007fbf92c00, 0x00000007fc2c0000)
No shared spaces configured.
GC日志的离线分析
可以使用一些离线的工具来对GC日志进行分析,比如sun的gchisto( java.net/projects/gchisto) , gcviewer( github.com/chewiebug/GCViewer ),这些都是开源的工具 , 用户可以直接通过版本控制工具下载其源码,进行离线分析 。
下面就已gcviewer为例,简要分析一下gc日志的离线分析 , gcviewer源代码工程是maven结构的,可以直接用maven进行package,这里编译的是1.34版本 , 本版本的快照已经上传至附件中 。
需要说明的是,gcviewer支持多种参数生成的gc日志,直接通过java –jar的方式运行 , 加载生成的gc日志即可
编写java代码时注意哪些 避免jvm gcgc?gc是jvm的内存垃圾回收啊,不需要避免的 。如果你不想回收对象,就不要把对象设置为null,如果想让jvm回收对象,就把对象设置为null
Java中gc的作用是什么?System.gc()用来强制立即回收垃圾,即释放内存 。
java对内存的释放采取的垃圾自动回收机制,在编程的时候不用考虑变量不用时释放内存,java虚拟机可以自动判断出并收集到垃圾 , 但一般不会立即释放它们的内存空间,当然也可以在程序中使用System.gc()来强制垃圾回收,但是要注意的是,系统并不保证会立即进行释放内存 。
java代码gc的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java代码改了不起作用、java代码gc的信息别忘了在本站进行查找喔 。

    推荐阅读