Java平台与内存管理

问题及答案来源自《Java程序员面试笔试宝典》第四章 Java基础知识 4.8Java平台与内存管理

1、为什么说Java是平台独立性语言?

平台独立性是指可以在一个平台上编写和编译程序,然后在其他平台上运行

保证Java具有平台独立性的机制为中间码和JVM(Java虚拟机),Java程序编译后不是生成了可执行代码,而是

生成了中间码,不同的平台有不同的JVM,由JVM来把中间码翻译成硬件平台能执行的代码(解释执行)

由上述过程可以看出JVM不具有平台独立性,与硬件平台相关

JVM执行中间码(解释执行)的过程分三步进行:

  • 代码的装入:由类加载器完成
  • 代码的校验:由字节码校验器完成
  • 代码的执行:即时编译(完全编译完了执行)和解释执行(边编译边执行)

常见笔试题 - Java程序运行从下到上的环境次序是?

Java程序 =》JVM/JRE =》操作系统 =》硬件

2、Java平台与其他语言平台有哪些区别?

Java平台是一个纯软件的平台,可以运行在一些基于硬件的平台(Linux、Windows等)上

Java平台主要包含两个模块:JVM和Java API

JVM:是一个虚拟出来的计算机,用来把Java编译生成的中间代码转换为机器可以识别的编码并

运行。它有自己完善的硬件架构,例如处理器、堆栈、寄存器等,还具有相应的指令系统,它屏蔽

了具体操作系统的信息,使得Java程序只要生成在JVM上运行的目标代码(字节码)就可以在多种平台

上不加修改地顺利运行

Java API:是Java为了方便开发人员开发而设计的,提供了许多非常有用的接口,这些接口也是用

Java编写的,并且运行在JVM上

3、JVM加载class文件的原理机制是什么?

Java运行指定程序时,JVM会将编译生成的.class文件按照需求和一定的规则加载到内存中,这个加载过程

是由类加载器完成的,具体来说就是由ClassLoader和它的子类来实现的

类的加载的分类:

  • 隐式加载:通过new的方式把类加载到JVM中
  • 显式加载:通过class.forName()方法来把类加载到JVM中

在Java中,类的加载是动态的,不会一次性把所有类加载到JVM中,而是保证程序运行的基础类(比如基类)

完全加载到JVM中,至于其他类就到需要的时候再加载

类加载的主要步骤:

  • 装载:根据查找路径找到class文件,然后导入
  • 链接:检查加载的class文件的正确性 =》给类中的静态变量分配存储空间 =》将符号引用转换成直接引用(可选)
  • 初始化:对静态变量和静态代码进行初始化工作

4、什么是GC?

在Java中,垃圾回收就是GC,是一个非常重要的概念,主要作用是回收程序中不再使用的内存

在C/C++中需要管理好内存的分配和释放,如果忘记或错误地释放内存往往会导致程序运行不正常甚至程序崩溃,而Java中提供

了垃圾回收器来自动检测对象的作用域,自动的把不再使用的存储空间释放掉。

垃圾回收器的三个任务:

  • 分配内存
  • 确保被引用对象的内存不被错误地回收
  • 回收不再被引用的对象的内存空间

引申 - 是否可以主动通知JVM进行垃圾回收?

开发人员不能直接调用JVM对某个对象进行垃圾回收,但可以调用System.gc()方法来通知垃圾回收器运行,这个方法的执行会停止所有

响应,去检查内存中是否有可回收的对象,这对程序的正常运行以及性能造成极大的威胁,因此在实际编程中不推荐使用这个方法

5、Java中是否存在内存泄漏问题?

在Java中判断一个内存空间是否符合垃圾回收的标准有两个:

  • 给对象赋值了null,以后再没有使用过
  • 给对象赋予了新值,重新分配了内存空间

一般来讲内存泄漏有两种情况:

  • 在堆中申请的空间没有被释放
  • 对象已不再被使用,但仍然在内存中保留着

垃圾回收机制的引入可以有效的解决前一种情况,但对于后一种情况,垃圾回收机制无法保证不再使用的对象会被释放

因此Java中的内存泄漏指的是上面的第二种情况

在Java中容易引起内存泄漏的原因:

(1)静态集合类,如HashMap和Vector

(2)各种连接

(3)监听器

(4)变量不合理的作用域

(5)单例模式

6、Java中的堆和栈有什么区别?

原文地址:https://www.cnblogs.com/wyb666/p/10346639.html

时间: 2024-10-27 01:41:28

Java平台与内存管理的相关文章

Java平台和内存管理

为什么说Java是平台独立的?Java实现平台独立的机制是“中间码”和“JVM” 解释执行的过程分为3步:代码的装入(load).代码的校验(check).代码的执行 代码的装入:类加载器(loader分为三类),被装入的代码有字节码校验器进行检查 Java字节码的执行分为两种方式: 即时编译方式 解释器先将字节码编译为机器码,然后执行该机器码: 解释执行方式 每次解释并执行一小段代码来完成Java字节码的所有操作,通常采用的是解释执行方式 JVM加载.class文件的原理机制? 类加载器分为:

JVM内存管理------JAVA语言的内存管理概述

引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓狂的内存溢出和泄露的问题. 可怕的事情还不只如此,有些使用其它语言开发的程序员,给JAVA程序员扣上了一个"不懂内存"的帽子,这着实有点让人难以接受.毕竟JAVA当中没有malloc和delete.没有析构函数.没有指针,刚开始接触JAVA的程序员们又怎么可能接触内存这一部分呢,更何况有不

java基础---JVM内存管理以及内存运行机制学习总结

自己从网上搜资料拼接了一张JVM内存图:如下图所示: 我们思考几个问题: 1.jVM是怎么运行的? 2.JVM运行时内存是怎么分配的? 3.我们写的java代码(类,对象,方法,常量,变量等等)最终存放在哪个区? VM运行时数据区域: 1.程序计数器(program Counter Register):   是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的 方式去实 现),字节码解释器工作时就是通过改

Java虚拟机一 内存管理机制

Java虚拟机的内存管理主要分两点:内存分配以及内存回收.· 一.内存分配图: 注: 所占区域的大小与实际的内存大小比例并无直接关系. 解读: 1.如图,分成两种颜色的内存区域,其中蓝色的是线程隔离的数据区,也就是说每一个线程都有自己的这么一个区域存放自己的数据,而青色区域则是线程共享的,里面的数据为所有线程共有,原则上都有权限访问. 2.程序计数器: 用途:用来给程序导航指路的.这个是一块较小的内存空间,可以看做是当前线程执行的字节码的行号指示器.理解就是虚拟机把java源代码编译成了字节码,

Java虚拟机的内存管理

众所周知,Java程序员写的代码是没有办法控制Java对象的内存释放的,完全有JVM暗箱操作. 虽然程序员把内存的释放的任务都交给了Java虚拟机,但是并不代表Java程序就不存在内存泄漏. 反而,某程度上,当出现内存泄漏,Debug会变得难度更大. 所以,Java程序员,有必要去了解Java虚拟机对于内存的管理以及垃圾回收的机制. Java虚拟机是如何判断一个对象可以回收? 当一个对象没有被任何其他所引用时,这个对象被Java虚拟机视为可回收. 早起的虚拟机,使用引用计数的方法判断对象是否可回

Java进阶之内存管理与垃圾回收

Java是在JVM所虚拟出的内存环境中运行的.内存分为栈(stack)和堆(heap)两部分.我们将分别考察这两个区域. 栈 在Java中,JVM中的栈记录了线程的方法调用.每个线程拥有一个栈.在某个线程的运行过程中,如果有新的方法调用,那么该线程对应的栈就会增加一个存储单元,即帧(frame).在frame中,保存有该方法调用的参数.局部变量和返回地址. 调用栈 Java的参数和局部变量只能是基本类型的变量(比如int),或者对象的引用(reference).因此,在栈中,只保存有基本类型的变

Java基础之内存管理原理及内存区域详解

一.概述 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干不同的数据区域,这些区域都有各自的用途以及创建和销毁的时间.Java虚拟机所管理的内存将会包括以下几个运行时数据区域,如下图所示: 下面就每一个区域进行阐述. 二.运行时数据区域 程序计数器 程序计数器,可以看做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节码解释器工作就是通过改变程序计数器的值来选择下一条需要执行的字节码指令,分支.循环.跳转.异常处理.线程恢复等基础功能都要依赖这个计数器来完成.

深入了解Java虚拟机和内存管理

1.java程序的执行过程      java源文件->解析器->class文件->java类加载器->java运行时数据区->执行引擎 2.我们接下来看一下java运行时数据区      包含程序计数器,虚拟机栈,本地方法栈,方法区,堆,其中程序计数器,虚拟机栈,本地方法区属于指令,方法区和堆属于数据.  一.程序计数器        用来指示程序执行哪一条指令,这跟汇编语言的程序计数器的功能在逻辑上是一样的.JVM规范中规定,如果线程执行的是非native方法,则程序计数

JAVA之自动内存管理机制

一.内存分配 1.JVM体系结构 2.运行时数据区域 3.内存分配二.内存回收 1.垃圾收集算法 2.垃圾收集器三.相关参考一.内存分配JVM体系结构 在了解自动内存管理的内存分配之前,我们先看下JVM的体系结构.代码编译的结果是从本地机器码转变为字节码,经过类加载器加载到虚拟机后才能执行程序.JVM的体系结构主要如下图所示: JVM体系结构 运行时数据区域 在上图中我们可以清楚地看到,JVM在执行Java程序的过程中会把它管理的内存划分为若干个不同的数据区域,分别是程序计数器.Java虚拟机栈