jdk jre java虚拟机 GCjava回收机制

jdk 和jre
jdk (Java Development Kit)
     java开发工具包,包含jre,java开发工具(java编译器,调试器),java的一些类库。
     jdk的文件夹下包含jre,jre下的bin 可以认为就是bin,lib是jvm工作时所需要的类库。
jre(java runtime environment)
     是java程序的运行环境,jre包含了jvm
JVM(java virtual machine)
      java虚拟机,它是整个java实现跨平台的最核心的部分。
      java是一个在编译基础上进行解释运行的语言。 所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。如下(一.3)
     所说的跨平台也就是说class并不直接与操作系统交互,而是经过虚拟机简介与操作系统交互,有虚拟机将程序解释给本地系统执行。
     【 解释 】在jvm中执行。
jdk,jre,jvm三者关系:
JVM:将字节码文件转成具体系统平台的机器指令。
JRE:JVM+Java语言的核心类库。
JDK:JRE+Java的开发工具。

JVM(java virtual machine)详解:
一  jvm结构:
  
     1.类加载器:将编译 好的.class文件 加载到内存当中。  加载的过程中也有一定的机制:父类委托机制;
     2. 执行引擎execute engine,也叫做解释器(Interpreter) ,负责解释命令,需要调用解释所需要jre下的类库lib ,提交操作系统执行。
     3. Runtime data area 运行数据区,也是内存区。jvm运行时操作的内存区。
               方法区Method Area:Meta   用来存储 类结构信息的地方,比如静态变量(static),常量(final),构造函数,编译后的代码。 相对而言,垃圾收集行为在这个区域是比较少出现的(所以常量和静态变量的定义要多注意)。方法区的内存收集还是会出现,不过这个区域的内存收集主要是针对常量池的回收和对类型的卸载。
               java堆Heap:   存储java实例或者对象的地方,这块是垃圾回收管理的主要区域(主要管理这个区域)。堆内存中存放的对象或者数组通过栈中的引用(数组的首地址)来调用。如果引用被释放了,数组和对象引用变量指向他的时候,内存也不会被释放,他们会变成垃圾,并且不能再使用,等到特定的时间呗java回收器回收。这也是java比较占用内存的原因,由java虚拟机的回收机制来处理。
               java栈Stack:  存储一些基本变量和对象的引用。当这些变量超出作用域后(全局,局部),java会自动释放为白变量分配的内存空间。 如果引用被释放了,相应的对象 就会失去引用,也就变成了可以被gc对象回收的垃圾。
               
            方法区和堆是被所有java线程共享的

jvm分配和回收

二。内存分配:
          静态分配发生在程序编译和连接的时候。动态分配则发生在程序调入和执行的时候。
         
          静态存储分配: 编译时能够确定内存空间大小的就采用静态存储分配机制。这种分配策略不允许有可变数组,嵌套循环等机构。

          动态存储分配: 的内存分配机制是动态存储分配。 在运行时才会知道需要创建那些对象。
三。回收策略:
几种算法:
标记-清除
复制
分代回收算法
分代回收策略: 如下图2
由于堆当中的对象生命周期不同,所以我们采取分代垃圾回收策略。有的对象声明周期长,如session(别的我也不知),有的对象生命周期短 如string对象(恩string是个类),如果不分区的话,每次回收都要来判断是否是垃圾,生命周期时间长的也需要判断,这样回收效率不高。(针对新生代周期短的对象 高频回收 Minor GC ,老年代的 低频回收Major GC。)

分代概念:
新生代--当产生一个对象的时候会将对象存放在ende中,当eden空间满的时候,进行一次垃圾回收Minor GC,将保存下来的对象分配到survivor区(s0,s1)当中.(可以看到下图中,s0+s1的存储空间大小=eden区的空间大小)
这里采用的回收算法是复制算法,保证在一个时刻,有一个survivor区是空的,达到无碎片目的。两个survivor区交替。 
老生代--- 经过多次MinorGC周期后,仍然存活下来的对象会被转移到年老代内存空间。进行Major GC (指发生在老年代的G),old区中存放的都是生命周期较长的对象。并且每一次gc,相当于他的年龄越大。
--Minor GC 发生的频率很高,回收的速度也很快, Major GC的速度一般会Minor GC慢10倍以上。
持久代--- perm 用于存放一些静态的文件,比如java类。

这里加一个扩展,方法区的数据可以选择是否实现垃圾回收,如果选择不垃圾回收,那么就存于持久代中。 垃圾收集行为在这个区域是比较少出现的,这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值