在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的文件结构:
- java
- |
- _______________________________|____________________________________
- | |
- jdk1.6.0 jre6
- ___________|____________________ _____|______
- | | | | |
- bin lib jre bin lib
- | | __________|_____________________
- java.exe tools.jar | |
- javac.exe dt.jar bin lib
- javap.exe _____|____ __________ ________|_______ ________ ________
- javah.exe | | | | | | | |
- javadoc.exe java.exe client server rt.jar ext security applet fonts
- java.dll | | charsets.jar |
- 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是运行一般程序使用的。
- JVM是java实现跨平台最核心的部分,所有的java文件都会先被编译成.class文件,然后在JVM运行,JVM将解释.class文件中的JVM指令转换成本地系统CPU的指令去执行。
- JRE是java最近的运行环境,光有JVM还不能让.class运行,因为在JVM解释class文件时需要调用解释需要的类库lib。我们可以从上图发现两套jre目录都是包含了bin和lib,我们可以将bin目录看作是JVM,而lib目录表示的就是我们解释所需要的类库,官方一点儿的叫法就是Java API,故,JVM和lib(Java API)构成了JRE。
- 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中被移除了。
相关推荐
【Java虚拟机(JVM)】 Java虚拟机(JVM)是Java程序运行的核心,它为Java提供了运行环境。在JVM中,内存被划分为几个不同的区域,分别是堆、方法区、虚拟机栈、本地方法栈和程序计数器。其中,垃圾收集(GC)主要...
初识java 各种缩写 SE-->Standard Edition标准版写桌面程序 ME-->Micro Edition微机版写嵌入式 EE-->enterprise edition企业版写服务器 JVM-->Java Virtual Machine虚拟机 GC-->Garbage Collection...
Java虚拟机(JVM)是Java程序运行的核心组件,它为Java代码提供了跨平台的运行环境。本篇文章将深入探讨JVM的基础知识,包括它的架构、内存模型、类加载机制以及垃圾收集等核心概念。 首先,JVM的架构主要包括以下...
初识JVM JVM分类 Java语言规范 JVM规范 介绍JVM的基本知识和发展历史,并介绍了Java语言规范和JVM规范。 第二课 JVM运行机制简介 堆、栈、方法区等 JVM启动流程 内存模型和volatile实例 解释和编译运行的概念 介绍...
- **GC算法**:分代收集、增量收集等。 - **3.6 函数的参数传递**: - **值传递**:基本类型。 - **引用传递**:对象。 - **3.7 static关键字**: - **类成员**:与类关联,而非特定对象。 - **静态初始化块*...
1.初识JVM.mp4 2.JVM运行机制.mp4 3.常用JVM配置参数.mp4 4.GC算法与种类.mp4 5.GC参数.mp4 6.类装载器.mp4 7.性能监控工具.mp4 8.Java堆分析.mp4......
1. **初识JVM**:这部分介绍了Java虚拟机的基本概念,包括它的历史背景、设计目标以及在Java程序执行中的重要作用。JVM是Java平台的核心组成部分,它为Java应用程序提供了跨平台的运行环境,通过解释和编译字节码...
初识对象 ##### 1.1 熟悉面向对象 在面向对象编程中,一切皆可视为对象。对象是由类定义的实体,它不仅包含了数据(即属性),还包含了对这些数据进行操作的方法。通过表格法来理解对象的概念是一种直观的方法: ...