当前位置:首页 > 内存 > 正文

java 内存管理

  • 内存
  • 2024-06-02 21:11:41
  • 1209

一、java编程内存管理需要注意的问题?

在进行程序系统维护时,是否会出现由于Java编程中的内存管理问题无法快速解决而导致系统错误的情况?下面我们一起来了解一下Java编程中内存管理的知识点有哪些。

程序计数器(理解)


程序计数器可以看作是当前线程中执行的字节码行号的指示器。在虚拟机的概念模型中,字节码解释器的作用是选择下一条要执行的字节码指令,改变分支、循环、跳转、异常处理和线程恢复等基本功能。全部都是必需的。使用此计数器来完成它。


Java虚拟机栈(理解)


Java虚拟机栈也是线程-私有生命周期与线程的生命周期相同。虚拟机栈描述了Java方法执行的内存模型。每个方法执行时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链表、方法退出信息等。从调用每个方法到完成执行的过程对应于将栈帧压入和弹出到虚拟机堆栈上的过程。


局部变量表存储编译器已知的各种原始数据类型(boolean、byte、char、short、int、float、long、double)。Reference和returnAddress类型(指向字节码指令的地址)


如果扩展期间无法申请足够的内存,则会引发OutOfMemoryError异常。


本地方法栈(理解)


本地方法栈与虚拟角色机类似的区别是,虚拟机栈提供虚拟机执行的Java方法,而本地方法栈提供虚拟机使用的本地方法。有些虚拟机直接将本地方法栈和虚拟机栈合二为一。


出现StackOverflowError和OutOfMemoryError异常。


Java堆


堆内存用于存储新对象和对象实例。它被使用了。种类。(核心)


Java堆是所有线程共享的内存区域,在虚拟机启动时创建。保存对象实例。


Java堆是垃圾收集器管理的主要区域。Java课程培训机构发现,当前收集器基本采用分代回收算法,因此Java堆也可以分为新生代和老年代。从内存分配的角度来看,线程共享的Java堆可以划分为多个仅线程分配缓冲区(TLAB)。



二、Java的内存管理机制是怎样的?Java中的内存分配分为三种类型,
1.静态存储区:程序编译时分配内存,如静态变量;
2.栈区:各种基本数据类型的局部变量都是在栈上创建的,当程序退出该变量的作用域时,该变量的内存会自动释放。
3.堆区:在堆中创建对象(包括数组)。程序运行时,使用new关键字来创建对象。创建对象时,会在堆中为其分配内存。
三、如何禁止自动内存管理,改用手动分配内存中的内存管理就是分配和释放对象。
在Java中,程序员必须使用关键字new为每个对象(基本类型除外)声明内存空间。每个对象都在堆中分配空间。
对象的释放由GC决定并执行。
在Java中,内存由程序分配并由GC释放。这种两行方法简化了程序员的生活。然而,它也增加了JVM的工作负载。这就是Java程序运行缓慢的原因之一。
GC释放空间方法:
监控各个对象的执行状态,包括对象的申请、引用、引用、分配等。当对象不再被引用时释放该对象。
2.内存管理结构
Java使用有向图来表示程序每个时刻的JVM内存分配情况。
将对象视为有向图的顶点,并将引用关系视为图有向边。有向边是指由参考源引用的对象。此外,每个线程对象都可以用作图的起始顶点。例如,大多数程序都是从主进程开始执行,图就成为从主进程的顶点开始的根树。在这个有向图中,所有根顶点可达的对象都是有效对象,GC不会回收这些对象。如果一个对象(连通子图)从根顶点不可到达(记住该图是有向图),则假设这个(这些)对象不再被引用,可以被GC回收。
3.使用有向图管理内存的优点和缺点
Java使用有向图来管理内存,可以解决引用循环的问题。例如,我有三个对象:只要您无权访问根进程,它们也可以相互引用。
这种方法的优点是内存管理非常精确,但效率较低。