java中gc
A. 了解java GC 工作中哪些场景需要用到,需要考虑到
GC的时候一般是内存不够了或者发生了内存泄漏。
请注意:内存不够用和内存泄漏是两个概念,不懂的话,请问度娘。
比如,你是一名Java后端工程师,从事大数据开发相关的岗位,那么你在写程序的时候就需要结合java GC的原理,对你的程序进行优化。
大白话讲,内存就那么多,优秀的工程师可以让它的利用率最高。
了解GC原理有助于你达到这一目的。
B. Java系统中GC频繁启动是什么原因
GC频繁发生的原因是堆空间不足。
修改permanent的大小是解决不了问题的,一般来说,permanent(持久带)的变化并不大,如果持久带不够用,一般不会GC,而是直接抛出持久带的OOM( out of memory)
所以,解决该公司的问题,最重要的是提高最小堆空间-Xms和最大堆空间-Xmx 的大小,提高年轻带-Xmn有助于在一定的程度解决GC的问题,但是注意,这些只是很简单的讨论。个人觉得,频繁GC发生的问题,最好是看看内存的DUMP文件,进行分析,在对JVM参数进行相对的配置。
JVM相关的问题还是比较复杂的,并不是几句对参数的描述就能解决问题,你还是要多看JVM相关资料。
评论(0)
C. Java中GC会回收static定义的方法中的对象吗
请将head中的d顺时针旋转180度。ps:gc不会主动回收static变量所指向的对象,因为static变量被作为gc roots,请google之!
D. java中GC是什么为什么要有GC
GC是垃圾回收的意思(gabage collection),内存处理器是编程人员容易出现问题的地方,忘记或者错误的内存回收导致程序或者系统的不稳定甚至崩溃,java的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,java语言没有提供释放已分配内存的俄显示操作方法。
希望能帮到你,谢谢!
E. Java中 gc的作用是什么
System.gc()用来强制立即回收垃圾,即释放内存。
java对内存的释放采取的垃圾自动回收机制,在编程的时候不用考虑变量不用时释放内存,java虚拟机可以自动判断出并收集到垃圾,但一般不会立即释放它们的内存空间,当然也可以在程序中使用System.gc()来强制垃圾回收,但是要注意的是,系统并不保证会立即进行释放内存
F. 在Java中如何主动调用GC
Java的公有API可以主动调用GC的有两种办法,一个是
System.gc();
// 或者下面,两者等价
Runtime.getRuntime().gc();
还有一个是JMX:
java.lang.management.MemoryMXBean.gc()
作用跟System.gc()也是类似的。
MemoryMXBean.gc()和System.gc()的内部实现都是Runtime.getRuntime().gc(),从效果上说两者一模一样没有区别。
G. java的gc为什么要分代
假如哈,现在的计算机能做的1ms扫描完所有live object,10ms完成live set的整理(compaction),大多数java应用都会觉得“这没毛病了”,那么,现在Hotspot JVM设计的那几套GC算法组合确实就没意义了。下面,再继续谈一哈GC的哲学。类似分布式系统的CAP theorem,GC算法设计也是有这个3取2的三角组合的:即延时(latency)、吞吐(throughput)和内存消耗(footprint)。基本的设计原理就是footprint为有限值的条件下,我们再在latency和throughput上挑一个优化,比如Hotspot JVM实现中,CMS算法主攻latency,Parallel GC 主攻throughput,G1 GC较关注latency同时兼顾一点throughput。来来来,我们开个脑洞:我们能不能放弃或减弱“footprint为有限值”这个条件。嗯~比如,一个应用1小时使用100G memory(暂时不管这100G会产生多少垃圾),服务器24小时会重启一次,那么,每次重启前java应用需要使用的内存会达到2,400G。也就是说,在这个case中,java能使用的内存如果能大于2,400G,我们根本就是不需要任何GC算法,not to mention 什么分代了; “java的gc为什么要分代”的哲学又是啥。我认为,是熵增原理 和 80/20法则。
H. java方法区有没有gc
java方法区是存在GC的
回收方法区
方法区即为永久代,主要回收两部分内容:废弃常量和无用类。
满足以下3个条件的类称之为无用类
该类所所有的对象实例已经被回收,也就是java堆中不存在该类的任何实例
加载该类的ClassLoader已经被回收
该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
在大量使用反射、动态代理、CGLib等ByteCode框架、动态生成JSP以及OSGI这类频繁自定义ClassLoader的场景都需要虚拟机具备类卸载的功能,以保证永久带不会溢出。
I. 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"。