jvm内存模型及gc,jvm的内存模型怎么栈溢出堆溢出gc真的用到过没

1,jvm的内存模型怎么栈溢出堆溢出gc真的用到过没因为java有自动的垃圾回收机制所以你没自己调用,当一个对象超出作用域或者没有引用时就有可能会被回收(不一定回收)List list =new ArrayList();list这个引用在栈内存中,ArrayList这个对象在堆内存中 。等号就是一个指针,左边是引用,相当于你的名字,右边是实例,相当于你本人 。我是来看评论的
2,如何理解jvm的eden和survivor区以及gc要理解eden和survivor区,先要知道垃圾收集算法中的 复制算法 。复制算法:将区域分成两部分,其中一部分作为保留空间,另一部分作为使用空间、当发生垃圾回收时,首先检查使用空间里有哪些对象是存活的,检查完之后把存活的对象复制到保留空间(这样复制过来的好处是减少了内存碎片 , 如果直接在使用空间清除的话 , 那空间会很零散)里,然后清洗使用空间 。这个eden就相当于是使用空间 , survivor就相当于是保留空间,通常情况下eden会比survivor大的多,因为eden和survivor都是属于新生代(还有老生代,jvm 将堆分为新生代和老生代) , 新生代里的对象一般都是朝生夕死,所以活下来的不多,所以保留空间小一些就好了 。GC就是垃圾回收了,是java语言的一大特点,我们生成的对象空间不需要自己手动去释放 , jvm自有GC线程来帮我们清理不用的对象 。只是分的两个区域而已, 新对象都会在eden区, 满了之后会清理, 如果满足需要保留的条件, 就会放到survivor区, 顾名思义 就是幸存者. 详细的原理请看专业书籍【jvm内存模型及gc,jvm的内存模型怎么栈溢出堆溢出gc真的用到过没】
3,jvm性能调优内存模型虚拟机原理能解决什么问题但是在平常编程中 , 肯定经常遇到OOM问题 。jvm的内存模型,简单来说就是堆栈结构,实际上内存的划分很复杂 。推荐《深入java虚拟机》来入门了解 。栈溢出和堆溢出 , 顾名思义,就是栈和堆上的内存不够用了,就抛出OOM异常呗 。可以通过调整参数来控制堆栈的内存大?。?Xmn -XmxGC就是针对堆,栈 , 方法区的垃圾回收行为 。这些问题还是要看书的,打字打死也说不完 。设置java虚拟机jvm启动内存参数方法如下:tomcat修改tomcat_home/bin/catalina.bat,在[echo using catalina_base:"%catalina_base%"] 上面加入 , 比如:set java_opts= -server -xms1536m -xmx1536m或者java_opts="-server -xms1536m -xmx1536m",服务器模式参数-server不加也可以  , 就变成set java_opts= -xms1536m -xmx1536m或者java_opts=" -xms1536m -xmx1536m",
4,jvm 什么情况下会触发minor gc当 JVM 无法为一个新的对象分配空间时会触发 Minor GC 。虚拟机在进行minorGC之前会判断老年代最大的可用连续空间是否大于新生代的所有对象总空间1、如果大于的话,直接执行minorGC2、如果小于,判断是否开启HandlerPromotionFailure,没有开启直接FullGC3、如果开启了HanlerPromotionFailure, JVM会判断老年代的最大连续内存空间是否大于历次晋升的大小 , 如果小于直接执行FullGC4、如果大于的话,执行minorGCMinor GC是新生代GC,指的是发生在新生代的垃圾收集动作 。由于java对象大都是朝生夕死的,所以Minor GC非常频繁,一般回收速度也比较快 。扩展资料:Java虚拟机本质上就是一个程序,当它在命令行上启动的时候,就开始执行保存在某字节码文件中的指令 。Java语言的可移植性正是建立在Java虚拟机的基础上 。任何平台只要装有针对于该平台的Java虚拟机 , 字节码文件(.class)就可以在该平台上运行 。引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译 。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行 。参考资料来源:百度百科-JVM当 JVM 无法为一个新的对象分配空间时会触发 Minor GC , 比如当 Eden 区满了 。所以分配率越高,越频繁执行 Minor GC 。内存池被填满的时候,其中的内容全部会被复制,指针会从0开始跟踪空闲内存 。Eden 和 Survivor 区进行了标记和复制操作,取代了经典的标记、扫描、压缩、清理操作 。所以 Eden 和 Survivor 区不存在内存碎片 。写指针总是停留在所使用内存池的顶部 。执行 Minor GC 操作时,不会影响到永久代 。从永久代到年轻代的引用被当成 GC roots,从年轻代到永久代的引用在标记阶段被直接忽略掉 。质疑常规的认知,所有的 Minor GC 都会触发“全世界的暂停(stop-the-world)”,停止应用程序的线程 。对于大部分应用程序,停顿导致的延迟都是可以忽略不计的 。其中的真相就 是,大部分 Eden 区中的对象都能被认为是垃圾,永远也不会被复制到 Survivor 区或者老年代空间 。如果正好相反,Eden 区大部分新生对象不符合 GC 条件,Minor GC 执行时暂停的时间将会长很多 。5,jvm什么时候会触发full gc除直接调用System.gc外,触发Full GC执行的情况有如下四种 。1. 旧生代空间不足旧生代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象,当执行Full GC后空间仍然不足,则抛出如下错误:java.lang.OutOfMemoryError: Java heap space为避免以上两种状况引起的Full GC , 调优时应尽量做到让对象在Minor GC阶段被回收、让对象在新生代多存活一段时间及不要创建过大的对象及数组 。2. Permanet Generation空间满Permanet Generation中存放的为一些class的信息等,当系统中要加载的类、反射的类和调用的方法较多时,Permanet Generation可能会被占满 , 在未配置为采用CMS GC的情况下会执行Full GC 。如果经过Full GC仍然回收不了,那么JVM会抛出如下错误信息:java.lang.OutOfMemoryError: PermGen space为避免Perm Gen占满造成Full GC现象,可采用的方法为增大Perm Gen空间或转为使用CMS GC 。3. CMS GC时出现promotion failed和concurrent mode failure对于采用CMS进行旧生代GC的程序而言 , 尤其要注意GC日志中是否有promotion failed和concurrent mode failure两种状况,当这两种状况出现时可能会触发Full GC 。promotion failed是在进行Minor GC时 , survivor space放不下、对象只能放入旧生代,而此时旧生代也放不下造成的;concurrent mode failure是在执行CMS GC的过程中同时有对象要放入旧生代 , 而此时旧生代空间不足造成的 。应对措施为:增大survivor space、旧生代空间或调低触发并发GC的比率,但在JDK 5.0+、6.0+的版本中有可能会由于JDK的bug29导致CMS在remark完毕后很久才触发sweeping动作 。对于这种状况,可通过设置-XX: CMSMaxAbortablePrecleanTime=5(单位为ms)来避免 。4. 统计得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间这是一个较为复杂的触发情况,Hotspot为了避免由于新生代对象晋升到旧生代导致旧生代空间不足的现象,在进行Minor GC时,做了一个判断,如果之前统计所得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间,那么就直接触发Full GC 。例如程序第一次触发Minor GC后 , 有6MB的对象晋升到旧生代,那么当下一次Minor GC发生时 , 首先检查旧生代的剩余空间是否大于6MB,如果小于6MB,则执行Full GC 。当新生代采用PS GC时,方式稍有不同,PS GC是在Minor GC后也会检查,例如上面的例子中第一次Minor GC后 , PS GC会检查此时旧生代的剩余空间是否大于6MB,如小于,则触发对旧生代的回收 。除了以上4种状况外,对于使用RMI来进行RPC或管理的Sun JDK应用而言,默认情况下会一小时执行一次Full GC 。可通过在启动时通过- java -Dsun.rmi.dgc.client.gcInterval=3600000来设置Full GC执行的间隔时间或通过-XX:+ DisableExplicitGC来禁止RMI调用System.gc 。1. 旧生代空间不足 。旧生代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象,当执行full gc后空间仍然不足,则抛出如下错误:java.lang.outofmemoryerror: java heap space 。2. permanet generation空间满 。permanet generation中存放的为一些class的信息等,当系统中要加载的类、反射的类和调用的方法较多时,permanet generation可能会被占满 , 在未配置为采用cms gc的情况下会执行full gc 。如果经过full gc仍然回收不了,那么jvm会抛出如下错误信息:java.lang.outofmemoryerror: permgen space 。3. cms gc时出现promotion failed和concurrent mode failure 。对于采用cms进行旧生代gc的程序而言,尤其要注意gc日志中是否有promotion failed和concurrent mode failure两种状况 。4、 统计得到的minor gc晋升到旧生代的平均大小大于旧生代的剩余空间 。这是一个较为复杂的触发情况,hotspot为了避免由于新生代对象晋升到旧生代导致旧生代空间不足的现象,在进行minor gc时,做了一个判断,如果之前统计所得到的minor gc晋升到旧生代的平均大小大于旧生代的剩余空间 , 那么就直接触发full gc 。gc的目标和减肥饮食计划是一样的,应该是(每次)少量(允许)多次 , 使得需要full gc的时候,stw的时间最少(应用响应时间不会因gc而增加),并最后达到控制总量的目的 。对java来说,新的虚拟机在实际的情况中,99%只要避免max heap调的过大过小就行了 。

    推荐阅读