java编程环境_第一章 Java编程环境

1、JDK安装

2、傻瓜式安装:

20200722020206737179.png

3、环境配置

1. JAVA_HOME

D:\JAVA\jdk// jdk的安装路径

2. Path

%JAVA_HOME%\bin

%JAVA_HOME%\jre\bin

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了。

20200722020207001837.png

面试题一

JDK与JRE的区别:

JRE是Java运行环境,如何只需运行Java程序而不用开发,安装JRE即可;

JDK是Java开发工具包,包含JRE,用于程序的开发与运行。

3、跨平台特性

平台指的是操作系统 (Windows,Linux,Mac)。

Java程序可以在任意操作系统上运行,一次编写到处运行。

实现跨平台需要依赖Java的虚拟机 JVM (Java Virtual Machine)

20200722020207167859.png

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可以主动请求回收垃圾。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值