`

初识Java GC

阅读更多

   在Java中,对象内存的分配与回收是依靠自动运行在JVM中的Garbage Collection线程来完成。Java不像C、C++还需要为内存回收写代码,这也是java在这么多语言中比较独树一帜的特点。

   了解java回收器,首先我们先来区分一下java中比较重要的几个专业术语,像JDK、JVM、JRE、HotSpot VM,除此在外,了解JVM的结构和java堆内存结构也是必不可少的。

关键术语

Java API:

帮助开发者建立应用的类库集合。

Java Development Kits (JDK):

一系列包含编译、运行、打包、分发、监控 Java应用的工具。是支持Java程序开发的最小环境。

Java Virtual Machine (JVM):

JVM相当于一个抽象的计算机,Java程序按照JVM规范书写,JVM是操作系统实现Java虚拟机的一种规范,它可以将Java指令转换成底层操作系统对应的指令并执行他们, 从而达到跨平台的效果。

Java Runtime Environment(JRE):

JRE 包含JVM的实现和Java API,是支持Java程序运行的标准环境。

 

 JDK与JRE区别

首先我们来回顾一下JDK的文件结构:

  1.                                   java
  1.                                     |
  2.      _______________________________|____________________________________
  3.      |                                                                   |
  4. jdk1.6.0                                                                 jre6
  5.      ___________|____________________                              _____|______
  6.     |           |                    |                             |           |
  7.     bin         lib                  jre                          bin         lib   
  8.     |           |          __________|_____________________  
  9. java.exe    tools.jar     |                                |          
  10. javac.exe   dt.jar       bin                              lib                  
  11. javap.exe            _____|____ __________         ________|_______ ________ ________          
  12. javah.exe           |          |          |       |        |       |        |        |  
  13. javadoc.exe     java.exe    client      server  rt.jar    ext  security  applet    fonts  
  14.                 java.dll       |          |   charsets.jar |                    
  15.                 awt.dll     jvm.dll    jvm.dll        localedata.jar  

 

由上图我们会发现我们安装完JDK后会拥有了两套JRE,java/jre6 和java/jdk1.6.0/jre,前面的那套jre相比后面这条少了Server端的JVM,不过直接把它复制过来就OK了。

为什么会有两套jre呢?

这是因为JDK中有很多Java编写的开发工具(如java.exe、javac.exe、jar.exe等),他们的具体实现都放置在\lib\tools.jar中,而这些工具基本都是java程序写出来的,所以JDK理所应当也需要一套jre才行。所以java/jre6是运行一般程序使用的。

  1.   JVM是java实现跨平台最核心的部分,所有的java文件都会先被编译成.class文件,然后在JVM运行,JVM将解释.class文件中的JVM指令转换成本地系统CPU的指令去执行。
  2.   JRE是java最近的运行环境,光有JVM还不能让.class运行,因为在JVM解释class文件时需要调用解释需要的类库lib。我们可以从上图发现两套jre目录都是包含了bin和lib,我们可以将bin目录看作是JVM,而lib目录表示的就是我们解释所需要的类库,官方一点儿的叫法就是Java API,故,JVM和lib(Java API)构成了JRE。
  3.  JDK的安装目录下包含6个文件夹、一个src类库源码压缩包和其他几个声明文件。其中,真正在运行Java时起作用的是下面四个文件夹:bin、include、lib、jre。

这样我会发现一些关系:

JDK包含JRE,而JRE又包含JVM。

bin目录最主要的是编译器(javac.exe)

include :java 和JVM交互用的头文件

lib:类库

jre:Java运行标准环境

总结一下,(这里的bin和lib和jre下的bin和lib是不一样的)JDK是用于Java程序开发,而jre只能运行class而没有编译功能。

Java Hotspt 虚拟机

每种JVM的实现都可能在垃圾回收机制的实现上会不同。在SUN公司被收购之前,Oracle公司就有JRockit JVM,收购SUN公司之后,又获得了Hotspot JVM。目前Oracle维护着两种JVM的实现,据说不久的将来,这两种JVM实现会合二为一。

 

JVM结构

下图总结了JVM中的关键组件,在JVM的结构中,跟垃圾回收关系密切的两个组件是堆内存和垃圾回收器。堆内存是对象存储和垃圾回收器进行回收的运行时数据区。



 

Java堆内存

     了解堆内存在Java内存模型中的地位是比较必要的。在运行期,Java对象会被存储在堆内存中,当对象不再被任何其他对象引用(也即 不可达),那么该对象就符合了被垃圾回收器回收的条件。在垃圾回收进程运行期间,这些符合条件的对象和空间将会被回收。

     堆内存有一下三个主要区域:

    1.新生代:新生代又分Eden区和两个大小相等的S0(from)和S1(to)区

                    Eden区:新建的对象必须通过Eden进入运行时数据区

                    S0:较老的对象从Eden区移到S0

                    S1:较老的对象从S0移到S1

     2.老年代:S1中足够老还未回收的实例提升到年老代

     3.永久代:存储类的基本信息、元数据等等。

    

   值得一提的是永久代已经从Java SE 8中被移除了。


 

 

 

  • 大小: 47.5 KB
  • 大小: 27.1 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics