栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java语言概述

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java语言概述

目录

java语言的特点是什么?

Java两种核心机制

核心机制—Java虚拟机

核心机制—垃圾回收

java有自己的内存回收机制,但为什么还存在内存泄漏的问题?


java语言的特点是什么?

>面向对象性:两个基本概念:类、对象;三大特性:封装、继承、多态

>健壮性:吸收了C/C++语言的优点,但去掉了其影响程序健壮性的部分(如指针、内存的申请与释放等),提供了一个相对安全的内存管理和访问机制

>跨平台性:通过Java语言编写的应用程序在不同的系统平台上都可以运行。

Java两种核心机制

Java虚拟机 (Java Virtal Machine)

垃圾收集机制 (Garbage Collection)

核心机制—Java虚拟机

JVM是一个虚拟的计算机,具有指令集并使用不同的存储区域。负责执行指令,管理数据、内存、寄存器。

对于不同的平台,有不同的虚拟机。

只有某平台提供了对应的java虚拟机,java程序才可在此平台运行

Java虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,到处运行”

核心机制—垃圾回收

不再使用的内存空间应回收—— 垃圾回收。

在C/C++等语言中,由程序员负责回收无用内存。

Java 语言消除了程序员回收无用内存空间的责任:它提供一种系统级线程跟踪存储空间的分配情况。并在JVM空闲时,检查并释放那些可被释放的存储空间。

垃圾回收在Java程序运行过程中自动进行,程序员无法精确控制和干预。

java有自己的内存回收机制,但为什么还存在内存泄漏的问题?

1.既然 Java 的垃圾回收机制能够自动的回收内存,怎么还会出现内存泄漏的情况呢?

这个问题,我们需要知道 GC 在什么时候回收内存对象,什么样的内存对象会被 GC 认为是“不再使用”的。

Java中对内存对象的访问,使用的是引用的方式。在 Java 代码中我们维护一个内存对象的引用变量,通过这个引用变量的值,我们可以访问到对应的内存地址中的内存对象空间。在 Java 程序中,这个引用变量本身既可以存放堆内存中,又可以放在代码栈的内存中(与基本数据类型相同)。 GC 线程会从代码栈中的引用变量开始跟踪,从而判定哪些内存是正在使用的。如果 GC 线程通过这种方式,无法跟踪到某一块堆内存,那么 GC 就认为这块内存将不再使用了(因为代码中已经无法访问这块内存了)。

通过这种有向图的内存管理方式,当一个内存对象失去了所有的引用之后,GC 就可以将其回收。反过来说,如果这个对象还存在引用,那么它将不会被 GC 回收,哪怕是 Java 虚拟机抛出OutOfMemoryError 。

2.java内存泄漏的根本原因是?

答:内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)。

3.堆溢出:静态集合类中存储对象

java.lang.OutOfMemoryError: Java heap space

4.栈溢出

java.lang.StackOverflowError

5.代码栈是什么?

Vector v = new Vector(10);

for (int i = 1; i < 100; i++) {

Object o = new Object();

v.add(o);

o = null;

}

在这个例子中,代码栈中存在Vector 对象的引用 v 和 Object 对象的引用 o 。

在 For 循环中,我们不断的生成新的对象,然后将其添加到 Vector 对象中,之后将 o 引用置空。

6.当 o 引用被置空后,如果发生 GC ,我们创建的 Object 对象是否能够被 GC 回收呢?

答案是否定的。

因为, GC 在跟踪代码栈中的引用时,会发现 v 引用,而继续往下跟踪,就会发现 v 引用指向的内存空间中又存在指向 Object 对象的引用。也就是说尽管 o 引用已经被置空,

但是 Object 对象仍然存在其他的引用,是可以被访问到的,所以 GC 无法将其释放掉。

如果在此循环之后, Object 对象对程序已经没有任何作用,那么我们就认为此 Java 程序发生了内存泄漏。

7.内存泄漏在哪个领域比较常见?

答:在移动设备对于内存和 CPU都有较严格的限制的情况下, Java 的内存溢出会导致程序效率低下、占用大量不需要的内存等问题。这将导致整个机器性能变差,严重的也会引起抛出OutOfMemoryError ,导致程序崩溃。

8.如何避免内存泄漏?

答:明确引用变量的生命周期,是方法内部的局部变量,还是类实例变量,与类实例生命周期相同的要声明为实例变量。

要避免这种情况下的内存泄露,要求我们以C/C++ 的内存管理思维来管理自己分配的内存。

第一,是在声明对象引用之前,明确内存对象的有效作用域。在一个函数内有效的内存对象,应该声明为 local 变量,与类实例生命周期相同的要声明为实例变量……以此类推。

第二,在内存对象不再需要时,记得手动将其引用置空。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1024920.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号