浅谈对Java内存的一些认知

来源:互联网 发布:java获取当前目录 编辑:程序博客网 时间:2024/06/02 04:14

前言:

由于java中有很多方便的对内存的管理机制,所以写的时候很多东西不需要你考虑到,java都能很好的处理。但是即使这样也不一定能写出优秀的程序,只有对内存有很深刻的认识,才能对写出好的程序有所帮助。

首先,Java内存管理原理:

     在java中,有java程序、虚拟机、操作系统三个层次,其中java程序与虚拟机交互,而虚拟机与操作系统交互。这也就保证了java的与平台无关性三者的运行原理是:

     1、程序运行前:Jvm向操作系统请求一定的内存空间,成为初始内存空间!程序执行过程中所需的内存都是由java虚拟机从这片内存空间中划分的。

     2、程序运行中:java程序一直向java虚拟机申请内存,当程序所需要的内存空间超出初始内存空间时,java虚拟机会再次向操作系统申请更多的内存供程序使用!

      3、内存溢出:程序接着运行,当java虚拟机已申请的内存达到了规定的最大内存空间,但程序还需要跟多的内存,这时会出现内存溢出的错误!

Java 程序在运行时,需要在内存中的分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有
特定的处理数据方式和内存管理方式。
:存储局部变量
堆 :存储new出来的东西
方法区
本地方法区 (和系统相关)
寄存器 (给CPU使用)在交接Java内存的管理之前我们首先要了解Java程序运行过程会涉及到的内存区域)

由于属于初学者 我暂时只了解在堆栈方面Java程序的内存分布。

1.首先我们先可以认为局部变量放在栈空间,new出来的东西放在堆空间;

2.局部变量可分为两种类型:基本类型和引用类型;

3.二者作为局部变量,都放在栈中,基本类型直接在栈中保存值,引用类型只保存一个指向堆区的指针,真正的对象在堆里。


作为参数时基本类型就直接传值

例:int i = 9;

由于是基本类型,直接在栈中存放i对应的值9。当i的值改变,直接改变栈空间里面的值。


引用类型传指针。我们可以通过改变栈空间里面的引用类型来操作堆空间里面的对象

例:Test test = new Test(1,2);

其中test是属于引用类型的局部变量,首先jvm会在栈空间里面开辟一块属于test的内存,里面放的是指针,该指针指向堆空

间里面的一块内存空间,里面放的是对象。操作test实际上是通过test的指针间接操作对象。

方法一旦结束,栈中的局部变量立即销毁,但是堆中对象不一定销毁。因为可能有其他变量也指向了这个对象,直到栈中没

有变量指向堆中的对象时,它才销毁,而且还不是马上销毁,要等垃圾回收扫描时才可以被销毁。