第一章 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编程环境的主要内容,如果未能解决你的问题,请参考以下文章