Java千百问_07JVM架构(005)_显示内存管理有什么弊端

点击进入_更多_Java千百问

1、显示内存管理有什么弊端

手动内存管理一般被称为显示内存管理,显示内存管理经常发生两种情况:

  1. 引用悬挂

    当一个被某个引用变量正在使用的内存空间,在重新分配过程中被释放掉了,释放后,该引用变量就处于悬挂状态(所引用的对象已经不存在了)。

    如果这个被悬挂引用变量,试图操作原来对象的时候,由于该对象本身的内存空间已经被手动释放掉了(已经不存在了),所以这个执行结果是不可预知的。

  2. 内存泄漏

    当某些引用变量不再引用该内存对象的时候,而该对象原本占用的内存并没有被释放,这种情况就是内存泄漏。

    例如,对某个链表进行了内存分配,因为手动分配内存不当,仅仅让引用变量指向了某个元素所处的内存空间,就使得这些元素所处的内存空间对程序来说处于不可达状态,而且这些对象所占有的内存也不能够被再使用,这个时候就发生了内存泄漏。

    而这种情况一旦在程序中发生,就会一直消耗系统的可用内存直到可用的内存耗尽。对计算机而言,内存泄漏是非常严重的,会使得本来正常运行的程序直接因为内存不足而中断。与Java中的Exception并不是一个级别的错误。

对于显示内存管理来说,手动管理内存成本太高,风险很大。所以大多数纯面向对象语言而言,都提供了语言本身具有的内存特性:自动化内存管理。比如Java,提供了一个垃圾回收器(Garbage Collector,GC),自动内存管理提供了更加可靠的代码使得内存能够在程序里面进行合理的分配。

2、java的自动内存管理有什么好处

java的自动内存管理(隐式内存管理)可以解决显示内存管理的问题:引用悬挂和内存泄漏。

  1. 对于引用悬挂

    JVM隐藏了对内存的管理,所以不会对正在使用的内存空间进行释放,也就不会出现引用悬挂。

  2. 对于内存泄漏

    一旦有对象没有被任何引用变量引用时,也就是说这些对象在JVM的内存池里面成为了不可引用对象,垃圾回收器会直接回收掉这些对象的内存(当然需要满足一些规则,具体看这里:[java垃圾回收机制是什么][2])。

    [2]:

时间: 2024-10-21 03:58:33

Java千百问_07JVM架构(005)_显示内存管理有什么弊端的相关文章

Java千百问_07JVM架构(018)_如何监控jvm的运行情况

点击进入_更多_Java千百问 1.如何监控jvm的运行情况 了解jvm内存模型看这里:java内存模型是什么样的 了解jvm内存管理看这里:jvm是如何管理内存的 了解jvm垃圾回收机制看这里:java垃圾回收机制是什么 了解jvm内存优化看这里:java内存如何优化 我们通常使用Jdk工具来监控jvm的运行情况,当然目前有很多第三方产品是通过jdk提供的api来组织数据进行监控的.具体来说有如下监控软件: Jconsole jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用.对垃圾回

Java千百问_07JVM架构(019)_运行时常量池是什么

点击进入_更多_Java千百问 1.运行时常量池是什么 运行时常量池(Runtime Constant Pool),它是方法区的一部分.Class文件中除了有类的版本.字段.方法.接口等描述等信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到常量池中. 了解java内存管理看这里:jvm是如何管理内存的 如图: 运行时常量是相对于常量来说的,它具备一个重要特征是:动态性.当然,值相同的动态常量与我们通常说

Java千百问_07JVM架构(003)_内存分配有哪些策略

点击进入_更多_Java千百问 1.内存分配有哪些策略 我们从编译原理讲起,不同的开发环境.开发语言都会有不同的策略.一般来说,程序运行时有三种内存分配策略:静态的.栈式的.堆式的 静态存储 是指在编译时就能够确定每个数据目标在运行时的存储空间需求,因而在编译时就可以给它们分配固定的内存空间. 这种分配策略要求程序代码中不允许有可变数据结构的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间. 栈式存储 栈式存储分配是动态存储分配,是由一个类似于堆栈的运行栈来

Java千百问_07JVM架构(010)_什么是老生代的标记算法

点击进入_更多_Java千百问 1.什么是老生代的标记算法 了解堆内存看这里:java堆内存是什么样的 了解java垃圾回收看这里:java垃圾回收机制是什么 所谓标记算法(Mark),分为多种,最简单直观的即标记-清除算法(Mark-Sweep).即将认定为可回收的内存做一个标记,然后统一将被标记的清理,算法图解如下: 算法过程: 1. 先判定对象是否可回收,对其标记. 2. 统一回收(简单地删除对垃圾对象的内存引用). 标记-清除算法十分简单直观,且容易实现和理解.但是有一个很严重的问题,内

Java千百问_07JVM架构(014)_什么是Dump文件

点击进入_更多_Java千百问 1.什么是Dump文件 Dump文件是进程的内存镜像.可以把程序的执行状态通过调试器保存到dump文件中. Dump文件是用来给驱动程序编写人员调试驱动程序用的,这种文件必须用专用工具软件打开. 当我们的程序发布出去之后,在客户机上是无法跟踪代码的,所以Dump(扩展名是 .dmp)文件对于我们来说特别重要.我们可以通过.dmp文件把出现问题的情况再现,然后根据再现的状况(包括堆栈调用等情况),可以找到出现问题对应的行号. 2.如何生成Dump文件 生成Dump文

Java千百问_07JVM架构(002)_jvm实例的结构是什么样的

点击进入_更多_Java千百问 1.jvm实例的结构是什么样的 在Java虚拟机规范中,一个虚拟机实例的行为主要组成部分为:子系统.内存区域.数据类型和指令. 这些组件描述了JVM内部的一个抽象结构.与其说这些组成部分的目的是进行JVM内部结构的一种支配,不如说是提供一种对外部行为的严格定义,该规范定义了这些抽象组成部分的相互作用,以及Java虚拟机执行所需要的行为. 了解jvm内存管理看这里:java内存模型是什么样的 下图描述了JVM实例的一个内部结构,其中主要包括主要的子系统.内存区域.

Java千百问_07JVM架构(016)_java内存如何优化

点击进入_更多_Java千百问 1.java内存如何优化 了解jvm内存管理看这里:jvm是如何管理内存的 了解堆内存看这里:java堆内存是什么样的 java内存的优化主要是通过合理的控制GC来实现,主要原则: 1. 不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况(因为GC过后这个值是不会变化的). 2. 使用JDK提供的内存查看工具,比如JConsole和Java VisualVM. 3. 优化内存主要的目的是降低youngGC的频率.减少fullG

Java千百问_07JVM架构(012)_fullGC、minorGC、magorGC有什么区别

点击进入_更多_Java千百问 1.fullGC.minorGC.magorGC有什么区别 fullGC.minorGC.magorGC还有youngGC是Java垃圾处理机制(GC)的名词,区分这几个概念非常简单: 老生代进行一次垃圾清理,被称为fullGC或者magorGC. 新生代进行一次垃圾清理,被称为youngGC或者minorGC. 了解java垃圾回收机制看这里:java垃圾回收机制是什么 解释完毕,不过要提一下的是,我们在JVM优化过程中的一个原则就是: 降低youngGC的频率

Java千百问_07JVM架构(011)_java垃圾回收都有哪些方式

点击进入_更多_Java千百问 1.java垃圾回收都有哪些方式 所谓垃圾回收方式,是指JVM提供的几种不同的垃圾回收器,不同的垃圾回收器进行垃圾回收时采用不同的方式.当然,总体原则遵循java垃圾回收机制. 了解java内存模型看这里:java内存模型是什么样的 了解堆内存看这里:java堆内存是什么样的 了解java垃圾回收机制看这里:java垃圾回收机制是什么 每种方式都有自己的优势与劣势.我们编程的时候可以通过向JVM传递参数来选择垃圾回收器.不同的垃圾回收期有大的不同,可以为我们提供完