JVM-随总


    jvm的内存分布:
    
        一、jvm:java的虚拟机
        
            1:所有的java代码都是在虚拟机中运行的

            2:JVM可以和不同的操作系统交互

            3:JVM帮工程师屏蔽了不同平台的差异性,提供了一致的编写接口
            
            
        二、JDK:(Java Development Kit) 是 Java 语言的软件开发工具包

            JRE:在JDK的安装目录下有一个jre目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是JVM,
                lib中则是jvm工作所需要的类库,而jvm和 lib合起来就称为jre。
                
        
        三、jvm有哪些内存空间?又分哪些内存?
        
            内存空间主要分为:
            
                1.线程共享:
                
                    线程共享主要有:方法区和堆;方法区中又有区是常量池;堆占用的内存空间是最大的,也是gc主要工作的地方;
                
                    静态常量池:编译期间产生的内存空间,有些人叫class常量池,class常量池不仅仅存放字符串和数字等字面量数据,
                                还存放类、方法的元数据信息。 

                    运行时常量池:则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,
                                  我们常说的常量池,就是指方法区中的运行时常量池。
                                  
                    相较于静态常量池,运行时常量池更具动态性,静态常量池是死的,基本不会变,但是运行时常量池可以在运行期间
                    通过String类的intern()方法加入新成员。
                
                2.线程私有:
                
                    主要分为:栈和寄存器;
                    
                    常量池:实际上分为两种形态:静态常量池和运行时常量池。  

               
            注意:1、运行时常量池中的常量,基本来源于各个class文件中的常量池。

                  2、程序运行时,除非手动向常量池中添加常量(比如调用intern方法),否则jvm不会自动添加常量到常量池。
                  
                  
        四、jvm堆区的新生代和老年代
        
            1、堆区为什么要分代?
            
                如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用,这样就会对堆的所有区域进行扫描。
                
                而我们的很多对象都是朝生夕死的,如果分代的话,我们把新创建的对象放到某一地方,当GC的时候先把这块存“朝生夕死”对象
                
                的区域进行回收,这样就会腾出很大的空间出来。
            
            2、新生代GC(minor gc)----------指发生在新生代的垃圾回收动作,因为JAVA对象大多数都是朝生夕死(80%对象)的特性,
               
               所以minor gc非常频繁,使用复制算法快速的回收。
               
               
            3、老年代的特点:
            
                存放"新生代"中生存了较长时间的对象,以及较大的对象。
                
                内存空间比新生代要大。
                
                垃圾回收的执行频率也会低很多。
                
            4、object1来说明分代垃圾回收算法中的回收轨迹:
            
                1、object1新建,出生于新生代的Eden区域;
                
                2、第一次minor GC,object1 还存活,移动到Fromsuvivor空间,此时还在新生代。
                
                3、第二次minor GC,object1 仍然存活,此时会通过复制算法,将object1复制到ToSuv区域此时object1的年龄age+1。
                
                4、第n次minor GC,object1 仍然存活,如果object1年龄为15直接进入老年代。当然还有一种情况要考虑,
                
                   当object1年龄不足15,也有可能进入老年代。
                   
                5、object1存活一段时间后,发现此时object1不可达GcRoots,而且此时老年代空间比率已经超过了阈值,
                
                   触发了majorGC(也可以认为是fullGC,但具体需要垃圾收集器来联系),此时object1被回收了。fullGC会触发 stop the world。
            
                总结:1、年轻代 gc 之后,存活于survivor 区域的对象的age会+1,当超过(默认)15的时候,转移到老年代。

                      2、动态对象,如果survivor空间中相同年龄所有的对象大小的总和大于survivor空间的一半,直接进入老年代。
                
                
        五、GC类型以及促发条件:
        
            分类:

                针对HotSpot VM的实现,它里面的GC其实准确分类只有两大种:

                Partial GC:并不收集整个GC堆的模式

                Young GC:只收集young gen的GC

                Old GC:只收集old gen的GC。只有CMS的concurrent collection是这个模式

                Mixed GC:收集整个young gen以及部分old gen的GC。只有G1有这个模式

                Full GC:收集整个堆,包括young gen、old gen、perm gen(如果存在的话)等所有部分的模式。

            触发条件:
                Young GC:当young gen中的eden区分配满的时候,或者说剩余内存小于即将new出来的对象的体积的时候触发。

                Old GC:当old gen区域分配满的时候

                Full GC:当准备要触发一次young GC时,如果发现统计数据说之前young GC的平均晋升大小比目前old gen剩余的空间大,
                
                         则不会触发young GC而是转为触发full GC。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值