在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初识篇】 在Java的世界里,初学者往往会面临许多挑战,但“初识Java_课后补充作业”正是为了帮助这些新手们提供必要的学习支持。这份资料旨在加深对Java编程语言的理解,提高学习效率,使初学者能更快地掌握...
第01讲 初识Java.ppt
Java 语言以其“一次编译,到处运行”的特性在编程界占据着重要地位。这是因为Java程序首先被编译成与平台无关的字节码(.class文件),这些字节码随后在任何支持Java的平台上由Java虚拟机(JVM)执行。JVM是Java最...
【JAVA基础-初识JAVA】 Java是一种广泛使用的高级编程语言,由Sun Microsystems(现已被Oracle公司收购)于1995年推出。它的设计目标是“一次编写,到处运行”,这意味着编写好的Java程序可以在任何支持Java环境的...
《初识Java微信公众号开发》 http://www.imooc.com/learn/368 附件是整理的源码编译没有错误。 环境说明:tomcat8.5、jdk1.8、dom4j-1.6.1、XStream-1.4.9 程序总是报错“org.xmlpull.v1.XmlPullParserException”,...
在本实践课程“Java2上机实践1初识java”中,我们将深入探索Java编程的基础概念,通过一系列有趣的实例来加深理解。这个压缩包包含了实验1的相关材料,旨在引导我们逐步掌握Java语言的核心特性。 首先,我们要从"猜...
"初识Java.zip"这个压缩包文件显然旨在帮助初学者入门Java编程。它包含的资源可能包括教学演示案例、上机练习参考答案以及课后作业参考答案,这些都是学习过程中非常重要的组成部分。 第一章"初识Java"通常会涵盖...
课堂笔记,第一次学习java的课堂笔记,第一次学习java的课堂笔记
初识Java的内容包括:什么是Java、Java的平台版本、Java的构成(JavaSE、JavaEE、JavaME)、Java语言的特性、Java的编译和运行命令、JDK的安装等...
Java程序设计--初识java 28.pdf
Java基础精品课01-初识java录屏1.java概念简介.mp4
这个“Java基础精品课01-初识java”课程旨在为初学者提供一个全面的入门指南,帮助他们理解Java的核心概念和基本语法。 在Java编程语言中,我们首先会接触到的是它的关键字、数据类型以及变量。Java的关键字是预定...
### 初识JAVA的知识:配置Java环境变量于Windows 7 #### 一、Java与环境变量的重要性 Java作为一门跨平台的编程语言,其运行环境的配置至关重要。无论是开发还是运行Java程序,都需要确保系统中正确设置了Java环境...
这个名为"初识java,用springBoot学习java.zip"的压缩包文件,显然是为了帮助初学者入门Java编程并深入理解Spring Boot的应用。 首先,让我们来了解一下Java的基础知识。Java的核心特性包括封装、继承、多态和抽象,...
Java基础精品课01-初识java录屏2.java的编译和运行.mp4
初识java_202410182342_54499.pdf
Java基础精品课01-初识java录屏6.标识符.mp4
【初识Java】是学习Java编程语言的基础阶段,这一阶段主要涵盖了Java的核心概念和技术。以下是对标题和描述中涉及知识点的详细解释: 1. **JavaEE**:全称为Java Enterprise Edition,是Java平台的一个版本,专门...