第一章 Java编程环境

Posted nhscjngsn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第一章 Java编程环境相关的知识,希望对你有一定的参考价值。

1、JDK安装

1、官方下载地址:https://www.oracle.com/index.html

2、傻瓜式安装:

技术图片

3、环境配置

1.  JAVA_HOME
    D:JAVAjdk		// jdk的安装路径
2.  Path
    %JAVA_HOME%in
    %JAVA_HOME%jrein

4、JDK安装路径下的目录

bin目录:该目录用于存放一些可执行程序。
      如javac.exe(java编译器)、java.exe(java运行工具),jar.exe(打包工具)和*javadoc. .exe(文档生成工具)等。
db目录:db目录是一个小型的数据库。
      从JDK 6 0开始,Java中引用了一个新的成员JavaDB ,这是一个纯Java实现、 开源的数据库管理系统。
这个数据库不仅轻便.而且支持JDBC 4.0所有的规范,在学习JDBC时,不再需要额外地安装一个数据库软件,选择直接使用JavaDB即可。
jre目录:Java Runtime Environment的缩写,意为Java程序运行时环境。
      此目录是Java运行时环境的根目录,它包括Java虚拟机,运行时的类包, Java应用启动器以及一个bin目录 ,但不包含开发环境中的开发工具。
include目录:由于JDK是通过C和C++实现的,因此在启动时需要引入一些C语言的头文件,该目录就是用于存放这些头文件的。
lib目录: lib是library的缩写,意为Java类库或库文件,开发工具.使用的归档包文件。
src.zip文件: src.zip为src文件夹的压缩文件, src中放置的是JDK核心类的源代码,通过该文件可以查看Java基础类的源代码。

2、JRE与JDK

JRE
      (Java Runtime Environment):Java运行环境(运行时类库)
      JRE = JVM + 类库
      包括Java虚拟机(JVM Java Virtual Machine)和Java程序所需的核心类库等,如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。
JDK
      (Java Development Kit):Java开发工具包
      JDK = JRE + JAVA的开发工具
      JDK是提供给Java开发人员使用的.其中包含了java的开发工具,也包括了JRE。所以安装JJDK ,就不用在单独安装JRE了。

技术图片

面试题一

JDK与JRE的区别:
      JRE是Java运行环境,如何只需运行Java程序而不用开发,安装JRE即可;
      JDK是Java开发工具包,包含JRE,用于程序的开发与运行。

3、跨平台特性

平台指的是操作系统 (Windows,Linux,Mac)。
Java程序可以在任意操作系统上运行,一次编写到处运行。
实现跨平台需要依赖Java的虚拟机 JVM (Java Virtual Machine)

技术图片

4、JVM

JVM
      (Java Virtual Machine):Java虚拟机。
      是整个Java实现跨平台最核心的部分,能够运行通过Java语言编写的应用程序。
      所有的Java程序会首先被编译为.class的类文件,Jvm虚拟机可以执行这种编译后的类文件,也就是说class并不直接与机器的操作系统相对应,
而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释为目标代码(不同操作系统不同),给本地系统执行。

5、JVM内存划分

1.寄存器(程序计数器):记录正在执行的虚拟机字节码的地址和系统cpu有关
2.本地方法栈:jvm调用本地方法时执行的内存区,一些第三方语言的方法
3.(虚拟机方法)栈:java存储局部变量方法执行的区,方法在这个区中执行压栈操作(先进后出的原则)
4.方法区(数据共享区):存放的是类的信息,常量,静态变量,共享数据
5.堆:new出来的对象和容器(新生代,老年代,永久代(1.8后将永久代单独划分为元空间))
注意:我们主要研究的是:方法区,栈,堆,因为寄存器	本地方法栈与系统相关

6、垃圾回收机制

java垃圾回收机制GC(面试题):
      与C/C++程序不同,Java语言不需要程序员直接控制内存回收,Java程序的内存分配和回收都是由JRE在后台自动进行的。
JRE会负责回收那些不再使用的内存,这种机制被称为垃圾回收,垃圾回收有下述特点:
      回收无用对象的内存空间。
      垃圾回收发生的不可预知性。

7、详解垃圾回收机制的原理

Java中GC主要回收堆内存中的数据:堆内存又细化分为:新生代,老年代,永久代

新生代:分为eden,From Survivor,TO Survivor
      绝大多数刚创建的对象会被分配在Eden区,其中的大多数对象很快就会消亡。Eden区是连续的内存空间,因此在其上分配内存极快。
(每次新生代的垃圾回收(又称Minor GC)采用copy算法,之后再讲)。
      最初一次,当Eden区满的时候,执行Minor GC,将消亡的对象清理掉,并将剩余的对象复制到一个存活区From?(此时,TO是空白的,两个Survivor总有一个是空白的);
      下次Eden区满了,再执行一次Minor GC,将消亡的对象清理掉,将存活的对象复制到TO中,然后清空Eden区同时也将From中消亡的对象清理掉,
将存活的对象也复制到TO区,然后清空From区;之后,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,
新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,
直到“To”区被填满,“To”区被填满之后,会将所有对象移动到年老代中。
      如果没有填满,当两个存活区切换了几次(每进行一次MinorGC,都会在存活的对象做一个标记,加1,
当标记的值大于15,HotSpot虚拟机默认15次,用-XX:MaxTenuringThreshold控制,进入老年代)之后,
仍然存活的对象(其实只有一小部分,比如,我们自己定义的对象),将被复制到老年代。
老年代
      在新生代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代,该区域中对象存活率高。
老年代的垃圾回收(又称Major GC)通常使用“标记-清理”或“标记-整理”算法。整堆包括新生代和老年代的垃圾回收称
为Full GC(HotSpot VM里,除了CMS之外,其它能收集老年代的GC都会同时收集整个GC堆,包括新生代)
当老年代的空间不足时,会触发Major GC/Full GC,速度一般比Minor GC慢10倍以上。
持久代(永久代)
      在JDK8之前的HotSpot实现中,类的元数据如方法数据、方法信息(字节码,栈和变量大小)、
运行时常量池、已确定的符号引用和虚方法表等被保存在永久代中,32位默认永久代的大小为64M,64位默认为85M,
可以通过参数-XX:MaxPermSize进行设置。GC不会在主程序运行期对永久区域进行清理,这也导致了永久代的区域会随着加载的Class的增多而胀满,
最终抛出OOM(内存溢出)异常。
      所以虚拟机团队在JDK8的HotSpot中,把永久代从Java堆中移除了,并把类的元数据直接保存在本地内存区域(堆外内存),称之为元空间。
      元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制。类的元数据放入?
native memory,?字符串池和类的静态变量放入java堆中.?这样可以加载多少类的元数据就不再由MaxPermSize控制,?而由系统的实际可用空间来控制。
总结:
      为了分代垃圾回收,Java堆内存分为3代:新生代,老年代和永久代。
      新的对象实例会优先分配在新生代,在经历几次Minor GC后(默认15次),还存活的会被移至老年代(某些大对象会直接在老年代分配)。
      Minor GC发生在新生代,当Eden区没有足够空间时,会发起一次Minor GC,将Eden区中的存活对象移至Survivor区。Major GC发生在老年代,
当升到老年代的对象大于老年代剩余空间时会发生Major GC。
      发生Major GC时用户线程会暂停,会降低系统性能和吞吐量。
      JVM的参数-Xmx和-Xms用来设置Java堆内存的初始大小和最大值。依据个人经验这个值的比例最好是1:1或者1:1.5。
比如,你可以将-Xmx和-Xms都设为1GB,或者-Xmx和-Xms设为1.2GB和1.8GB。

Java中不能手动触发GC,但可以用不同的引用类来辅助垃圾回收器工作,是我们可以主动请求回收垃圾System.gc可以主动请求回收垃圾

以上是关于第一章 Java编程环境的主要内容,如果未能解决你的问题,请参考以下文章

《大道至简》第一章——编程的精义_读后感(Java伪代码形式)

第一章:java语言概述与开发环境

《大道至简》第一章JAVA语言伪代码

java并发编程实战第一章

《大道至简》第一章java伪代码分析

大道至简第一章伪代码