Java 垃圾回收机制---GC/FullGC

jvm调优: DOC 界面--jps (查看当前有哪些进程执行)  jmap(查看当前进程中对应线程数及对象磁盘位置信息、线程中对象在内存中所占用空间)   jconsole(查看整体进程中对象生命周期及内存中运行的情况)

弄清楚jvm内存模型是jvm调优的第一步:垃圾回收是一种在堆内存中找出那些对象在被使用(指针指向的对象)那些闲置(指针未引用),并将闲置的清除,压缩内存空间,为新进对象让路;堆内存和方法区内存是所有线程所共享的   栈内存是每个线程互不共享的

jvm模型分三块--》

     method(方法区):存储static变量、.java自编译生成的.class Object(内存中只存储一份) 类的结构信息 例如:常量池、构造函数、普通方法的字节码内容,还有一些类、实例、接口初始化时用到的特殊方法;当创建接口和类时,如果构造运行时常量池所需空间超过method area 所能分配的最大内存空间就会抛出outofmemorerror 

在每一次运行时常量池都会分配到jvm方法区中,在类和接口被加载到jvm中时,对应的运行时常量池也会被创建

    heap(堆区):.method object派生类(1MB>)对象----最容器造成内存溢出区域  分三块 old Generation area(老年代) | yong Generation area(新生代) | permanent Generation

    stack(栈区):存储(<1mB)object对象 、引用类型变量、基本类型、applicationContext 环境;

虚拟机栈:java方法执行的内存模型,每个方法执行时候同时会创建一个线帧,用于存储局部变量表,操作数栈,动态链接,方法出口   每个方法被调用直至执行完成的过程就对应着一个线帧在虚拟机中从入栈到出栈的过程  

程序计数器:存储每个线程的每个执行指令,此区域不会有益处情况

本地方法栈:用于支持本地方法即非java语言实现的方法

虚拟机栈和本地方法栈,当线程分配的栈容量超过jvm允许的最大容量时抛出stackoverflowerError异常

众所周知派生类对象创立之初是存储在heap区的新生代中的伊甸园区,任务开始执行线程启动,访问内存中的heap区的对象,对象就会从伊甸园区调派到新生代中的from区,线程使用对象的生命周期结束以后系统会自动调用gc回收, gc回收时所有的线程都需要暂停,直到事件完成;如果对象是全局所共享的那么执行完任务以后,,任然存活于内存中,并最终分发到老年代;同时当一个线程使用对象执行完任务以后,另一个线程接着使用这个对象那么就会直接将对象转移到新生代代中的to区,新生代中的to  from两区适用于处理线程共享对象并且要让对象一直存活在新生代

永久带用来描述jvm应用程序中类和方法的元数据,如果jvm发现某些类不在需要,并且其他类可能需要空间,则这些类可能会被回收

jvm虚拟机启动之初将任何对象分配给eden区,剩下的survivor中的from  to 都是空的,当eden装满以后会触发轻微的垃圾回收,引用的对象被移动到from区,并且清除eden空间,将删除未引用的的对象,from区对象使用完以后会启动gc,在上一次gc中的幸存者会会增加年龄并移动到to中,from eden区会被清空,survivor区中有不同的年龄对象,接着下一次gc以后又会执行同样的动作,当老化到一定阈值对象就会从新生代变成老年代,随着较小gc的持续发生,对象将会被持续的移动到老年代中,最终我们将对老年代进行full gc,清理并最终解压该空间!故我们要将新生代和老年代的max Min 值设置成一样大!

猜你喜欢

转载自blog.csdn.net/weixin_44600925/article/details/90900153