Java基础


Hello!大家好哇!我是一名刚刚开始学习Java的小白。这也是我的第一个博客,这篇博客主要讲Java运行时的内存存储。内容有不正确或者是有偏差的地方,还希望大佬指正。

Java程序的运行过程

要想知道一个Java程序是怎么运行的,首先要知道需要什么它才能运行。下面就从Java程序运行所需要的东西开始讲解。

Java程序的运行需要Java程序

Java程序的运行肯定需要有Java程序文件(好像说了句废话)。Java程序文件指的是什么呢?就是 .java文件,好比大家都熟悉的 HelloWorld代码,放在记事本中,文件类型修改为java文件,就是一个Java程序文件了。

Java程序的运行需要运行环境

Java程序的运行需要运行环境,这句话也很好理解。就好比在生活中想要游泳,得要有一个可以游泳的环境(泳池,河流等)。Java程序的运行同样也需要运行环境。这里的运行环境指的是JRE(Java Runtime Environment),中文名称也叫Java运行环境,是运行Java程序必须要有的工具。

JRE,JVM与JDK的关系

上面讲的是JRE,是运行Java程序必须要有的工具。那么计算机是如何将一个Java程序文件去运行的呢?首先将编写好的Java文件进行编译。再将编译好的文件在JVM(Java Virtual Machine)中运行。Java文件的编译实现是通过javac程序进行编译(JRE/JDK的bin文件中),这也是为什么要将JDK的bin文件加入环境变量的原因。编译完成之后,会得到一个字节码(.class)文件。再通过java程序(JRE/JDK的bin文件中)进行运行字节码(.class)文件。java程序运行字节码文件的过程是在 JVM上进行的。也就是说,Java程序运行时运行的是字节码文件,是在 JVM上进行的,所以,JVM是内嵌于JRE之中的。
上面讲的是Java程序的运行,仅限于运行Java文件,如果想要对Java进行修改,还需要JDK(Java Development Kit)。JDK是Java开发工具包,是开发Java程序必须的一个工具。JDK一样也需要具有运行Java程序的功能,所以,JDK中内嵌了JRE。JDK与JRE的区别就是,JRE只能去运行Java程序,不能对Java程序去进行读取和修改操作,而JDK是可以对Java程序进行读取和修改的。JDK,JRE,JVM三者的关系如下图图所示。
JDK,JRE,JVM三者的关系

JVM

如下图所示JVM中,有以下部分构成。本文着重讲解内存空间和垃圾收集器。

GC(Garbage Collection)垃圾收集器
GC是垃圾回收机制,当我们创建变量的时候,就会在计算机中占用一定的内存。C/C++必须需要程序员手动释放内存,而Java有GC机制,无需程序员手动释放内存的操作。那么GC是如何来实现的呢?这就要涉及到JVM内存空间了。

JVM内存空间

JVM内存空间包括栈,堆,方法区(本地方法栈不着重讨论)。
(stack)的内存空间很小(大概2M左右),特点是存储速度快。当用户创建局部变量的时候,就会在栈里面创建一个内存去存储这个变量的地址。存储的时候会自下而上去存储,通过指针的移动来确定内存的更改。就好比在桶里放小球一样,先进去的小球等上面的小球都出去了一直才能出去。栈存储的对象也是先进后出。并且每一次内存发生变化时,都需要确定好内存变化的大小。对应的就是指针要确定好移动的大小和范围。
(heap)内存存放的是引用数据类型的对象。与栈相比,不需要提前确定好内存的变化大小,比较灵活。只有当新创一个对象(new)的时候,才会在堆内存去存储该对象。可以通过栈内存中对象的地址去访问修改对象的值。什么时候会触发GC机制呢?当把一个对象A赋值给对象B的时候,其实赋值不是A的“值”,而是A的对象地址。这样会导致B的对象地址被A的对象地址所覆盖,这样就无法访问到原来B对象的值了。这时候GC会自动将原来B的值给释放掉(删除)。
方法区又被称为静态区,方法区存储的内容可以被所有线程共享,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值