5、堆和栈的区别
栈是运行时单位,代表着逻辑,内含基本数据类型和堆中对象引用,所在区域连续,没有碎片;堆是存储单位,代表着数据,可被多个栈共享(包括成员中基本数据类型、引用和引用对象),所在区域不连续,会有碎片。
1、功能不同
栈内存用来存储局部变量和方法调用,而堆内存用来存储Java中的对象。无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中。
2、共享性不同
栈内存是线程私有的。
堆内存是所有线程共有的。
3、异常错误不同
如果栈内存或者堆内存不足都会抛出异常。
栈空间不足:java.lang.StackOverFlowError。堆空间不足:java.lang.OutOfMemoryError。
4、空间大小
栈的空间大小远远小于堆的。
6、什么时候会触发FullGC
除直接调用Systegc外,触发FullGC执行的情况有如下四种。
旧生代空间不足
旧生代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象,当执行FullGC后空间仍然不足,则抛出如下错误:
java.lang.OutOfMemoryError:Javaheapspace
为避免以上两种状况引起的FullGC,调优时应尽量做到让对象在MinorGC阶段被回收、让对象在新生代多存活一段时间及不要创建过大的对象及数组。
PermanetGeneration空间满
PermanetGeneration中存放的为一些class的信息等,当系统中要加载的类、反射的类和调用的方法较多时,PermanetGeneration可能会被占满,在未配置为采用CMSGC的情况下会执行FullGC。如果经过FullGC仍然回收不了,那么JVM会抛出如下错误信息:
java.lang.OutOfMemoryError:PermGenspace
为避免PermGen占满造成FullGC现象,可采用的方法为增大PermGen空间或转为使用CMSGC。
CMSGC时出现promotionfailed和concurrentmodefailure
对于采用CMS进行旧生代GC的程序而言,尤其要注意GC日志中是否有promotionfailed和concurrentmodefailure两种状况,当这两种状况出现时可能会触发FullGC。
promotionfailed是在进行MinorGC时,survivorspace放不下、对象只能放入旧生代,而此时旧生代也放不下造成的;concurrentmodefailure是在执行CMSGC的过程中同时有对象要放入旧生代,而此时旧生代空间不足造成的。
应对措施为:增大survivorspace、旧生代空间或调低触发并发GC的比率,但在JDK5.0+、6.0+的版本中有可能会由于JDK的bug29导致CMS在remark完毕后很久才触发sweeping动作。对于这种状况,可通过设置-XX:CMSMaxAbortablePrecleanTime=5(单位为ms)来避免。
统计得到的MinorGC晋升到旧生代的平均大小大于旧生代的剩余空间
这是一个较为复杂的触发情况,Hotspot为了避免由于新生代对象晋升到旧生代导致旧生代空间不足的现象,在进行MinorGC时,做了一个判断,如果之前统计所得到的MinorGC晋升到旧生代的平均大小大于旧生代的剩余空间,那么就直接触发FullGC。
例如程序第一次触发MinorGC后,有6MB的对象晋升到旧生代,那么当下一次MinorGC发生时,首先检查旧生代的剩余空间是否大于6MB,如果小于6MB,则执行FullGC。
当新生代采用PSGC时,方式稍有不同,PSGC是在MinorGC后也会检查,例如上面的例子中第一次MinorGC后,PSGC会检查此时旧生代的剩余空间是否大于6MB,如小于,则触发对旧生代的回收。除了以上4种状况外,对于使用RMI来进行RPC或管理的SunJDK应用而言,默认情况下会一小时执行一次FullGC。可通过在启动时通过-java-Dsun.rmi.dgc.client.gcInterval=来设置FullGC执行的间隔时间或通过-XX:+DisableExplicitGC来禁止RMI调用Systegc。
7、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。
喜欢带着游戏账号流浪请大家收藏:()带着游戏账号流浪
请勿开启浏览器阅读模式,否则将导致章节内容缺失及无法阅读下一章。
相邻推荐:外室娇滴滴,权臣宠上瘾 【穿越】养的崽占有欲太强怎么办 宝可梦之解放世界 拜师九叔:我家衣柜通九叔义庄 我在诡异游戏世界里当NPC 让我勾引太子,我入宫你哭什么? 海妖() 失眠飞行() 云鸾归 穿书年代,她选择上交灵泉 暗恋月亮日记 震惊!爬出棺材后我被读心了! 开局男主被杀,男二上位杀伐果断 快穿:逆袭女配太撩人 无限续杯() 变成西方血族后我在修真界瞎溜达 骄阳与繁星() 全球灾变:我被病娇大小姐看上了 长生:因为死不了所以只能长生了 宦官他以下犯上