`
youyu4
  • 浏览: 435398 次
社区版块
存档分类
最新评论

JVM之对象的了解

 
阅读更多

JVM之对象的了解

 

对象的大小

 

在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小。

 

Object ob = new Object();
    这样在程序中完成了一个Java对象的生命,但是它所占的空间为:4byte+8byte。4byte是上面部分所说的Java栈中保存引用的所需要的空间。而那8byte则是Java堆中对象的信息。因为所有的Java非基本类型的对象都需要默认继承Object对象,因此不论什么样的Java对象,其大小都必须是大于8byte。

 

 

Class NewObject {
    int count;
    boolean flag;
    Object ob;
}
    
// 其大小为:空对象大小(8byte)+int大小(4byte)+Boolean大小(1byte)+空Object引用的大小(4byte)=17byte。但是因为Java在对对象内存分配时都是以8的整数倍来分,因此大于17byte的最接近8的整数倍的是24,因此此对象的大小为24byte。
 

 

注意:

基本类型的包装类型的大小。因为这种包装类型已经成为对象了,因此需要把他们作为对象来看待。包装类型的大小至少是12byte(声明一个空Object至少需要的空间),而且12byte没有包含任何有效信息,同时,因为Java对象大小是8的整数倍,因此一个基本类型包装类的大小至少是16byte。这个内存占用是很恐怖的,它是使用基本类型的N倍(N>2),有些类型的内存占用更是夸张(随便想下就知道了)。因此,可能的话应尽量少使用包装类。在JDK5.0以后,因为加入了自动类型装换,因此,Java虚拟机会在存储方面进行相应的优化。

 

 

 

四种引用类型

 



 

强引用

 

当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。 

 

A a = new A();
 

 

 

软引用

 

如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。

 

A a = new A();
SoftReference aSoftRef=new SoftReference(a); 
软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。

 

 

 

弱引用

 

只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。

 

A a = new A();
WeakReference aWeak=new WeakReference(a);
弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。

 

 

 

虚引用

 

虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。

 

ReferenceQueue queue = new ReferenceQueue ();
PhantomReference pr = new PhantomReference (object, queue); 
虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。

 

 

 

 

使用软引用构建敏感数据的缓存

 

为什么需要使用软引用

 

       假设我们的应用会用到大量的默认图片,比如应用中有默认的头像,默认游戏图标等等,这些图片很多地方会用到。如果每次都去读取图片,由于读取文件需要硬件操作,速度较慢,会导致性能较低。所以我们考虑将图片缓存起来,需要的时候直接从内存中读取。但是,由于图片占用内存空间比较大,缓存很多图片需要很多的内存,就可能比较容易发生OutOfMemory异常。这时,我们可以考虑使用软引用技术来避免这个问题发生。 

 

 

如何使用软引用

 

SoftReference的特点是它的一个实例保存对一个Java对象的软引用,该软引用的存在不妨碍垃圾收集线程对该Java对象的回收。也就是说,一旦SoftReference保存了对一个Java对象的软引用后,在垃圾线程对这个Java对象回收前,SoftReference类所提供的get()方法返回Java对象的强引用。另外,一旦垃圾线程回收该Java对象之后,get()方法将返回null。

MyObject aRef = new
MyObject();

SoftReference aSoftRef=new SoftReference(aRef); 

对于这个MyObject对象,有两个引用路径,一个是来自SoftReference对象的软引用,一个来自变量aReference的强引用,所以这个MyObject对象是强可及对象。

 

我们可以结束aReference对这个MyObject实例的强引用:

aRef = null;

 

用强引用回收软引用,回收之后,调用get()方法就只能得到null了。

MyObject anotherRef=(MyObject)aSoftRef.get(); 

 

 

 

怎么判断对象可以被回收

 

根搜索算法

 

 

在主流的商用程序语言中(java和c#),都是使用根搜索算法(GC Roots Tracing)判断对象是否存活的。这个算法的基本思路就是通过一系列的名为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(用图论的话来说就是从GC Roots到这个对象不可达)时,则证明此对象是不可用的。

 

java中可以作为GC Root的对象

 

  • 虚拟机栈(栈帧中的本地变量表)中的引用对象
  •  方法区中的类静态属性引用的对象
  • 方法区中的常量引用的对象
  • 本地方法栈中JNI(即Native方法)的引用的对象

 

 

 

 

 

参考:http://pengjiaheng.iteye.com/blog/518623

  • 大小: 18.4 KB
  • 大小: 25.8 KB
分享到:
评论

相关推荐

    jvm 详细介绍,了解jvm各个组成部分和功能

    堆栈结构是 JVM 中重要的内存管理组件之一。它主要用于存储方法调用过程中的局部变量、操作数栈等数据。每个线程在其生命周期内都会有一个对应的堆栈结构,其中包含了一个或多个帧(Frame)。每个帧对应一个方法调用...

    jdk,jvm源码

    了解JVM源码可以帮助我们深入理解Java程序的运行过程,优化内存使用,提升程序性能,排查故障。例如,通过阅读垃圾回收器的源码,我们可以学习如何调整参数以适应不同的应用场景;通过分析类加载机制,可以实现...

    JVM调优实战(转)

    在垃圾回收过程中,JVM会将对象分为三类:存活对象、垃圾对象和不可达对象。存活对象是指当前仍然被引用的对象,垃圾对象是指无用的对象,而不可达对象是指无法被引用的对象。 3. 性能优化策略 性能优化是指通过...

    java基础之JVM

    ### Java基础之JVM ...以上概述了JVM的基本概念及其核心组成部分,了解这些内容对于深入学习Java编程语言和提升编程效率至关重要。此外,掌握JVM的工作原理还有助于开发者更好地理解和优化Java应用程序的性能问题。

    002 RJPOS:完成jvm对象的设计

    【标题】"002 RJPOS:完成JVM对象的设计" 在Java开发中,理解JVM(Java虚拟机)的工作原理对于优化程序性能、解决内存问题以及深入掌握Java编程至关重要。RJPOS项目中的"完成JVM对象的设计"这一主题,主要探讨了如何...

    JVM垃圾回收机制

    在Java编程中,JVM(Java虚拟机)的...在实际应用中,了解和掌握JVM垃圾回收机制对于编写高性能和稳定的Java程序至关重要。开发者需要根据应用特点和运行环境选择合适的垃圾收集器和配置参数,以达到最优的性能表现。

    jvm 启动过程 JVM 原理

    JVM是Java Virtual Machine的缩写,它是Java平台的核心组件之一。它的主要任务是将编译后的Java类文件(.class文件)中的字节码转换为特定平台的机器码,实现了Java的“一次编写,到处运行”的跨平台特性。JVM由多个...

    java jvm初步了解;打卡狂神

    Java JVM 初步了解 在 Java 中,JVM(Java Virtual Machine)扮演着至关重要的角色,它是 Java 语言的 runtime 环境,负责将 Java 字节码翻译成机器代码并执行。下面是对 JVM 的初步了解。 1. JVM 的理解 JVM 是 ...

    JVM图解-JVM指令-JVM原型图.rar

    - JVM负责自动管理内存,通过垃圾收集机制回收不再使用的对象所占用的空间。 - 常见的垃圾收集算法有标记-清除、复制、标记-整理和分代收集等。 4. **类加载机制**: - 双亲委派模型:当一个类加载器需要加载类...

    马老师jvm调优实战笔记

    马老师 JVM 调优实战笔记 JVM 调优是 Java 开发者们不可或缺的技能,它直接...JVM 调优是 Java 开发者们不可或缺的技能,通过了解 JVM 的结构和工作机制,我们可以更好地进行调优,提高 Java 应用程序的性能和稳定性。

    JVM成神之路.rar

    "JVM成神之路.rar"这个压缩包显然提供了一条深入理解JVM的路径,通过作者精心录制的6小时视频教程和54页的配套笔记,我们可以期待全面了解JVM的体系结构以及与其相关的内存管理,特别是垃圾回收(GC)机制。...

    深入JVM内核—原理、诊断与优化

    1. **JVM结构与原理**:首先,我们需了解JVM的基本架构,包括类装载器、运行时数据区、执行引擎、本地方法接口和本地库。特别是堆内存、栈内存、方法区(元空间)以及垃圾收集机制,它们是理解JVM运行时行为的关键。...

    浅谈jvm原理

    "浅谈 JVM 原理" JVM(Java Virtual Machine)是一种虚拟机,它可以模拟完整的硬件系统功能,运行在一个完全隔离的环境中,提供了...只有深入了解 JVM 的原理和机制,才能更好地使用 Java 语言编写高效、可靠的程序。

    JVM

    1. **堆内存**:所有对象都在堆中创建,JVM通过垃圾收集机制自动回收不再使用的对象。 2. **栈内存**:每个线程都有自己的栈,用于存储局部变量表、操作数栈、动态链接和方法出口等信息。 3. **方法区**:存储类信息...

    JVM虚拟机复习宝典

    对象创建是Java程序中最常见的操作之一。下面详细介绍了对象创建的主要步骤: 1. **类加载检查**:当JVM遇到new指令时,会检查指令参数是否能定位到类的符号引用,并确认该类是否已经完成加载、解析和初始化。如果...

    Java JVM Instruction Set

    当调用对象的方法时,JVM需要确定对象的类型并找到正确的方法实现。这涉及到查找方法所在的类,并通过指针间接调用。 ##### 创建和访问数组 创建数组时,JVM需要在堆中分配内存,并记录数组的大小和类型。访问数组...

    jvm 内存分析文档

    JVM内存分配策略基于对象的生命周期,新生代采用复制算法,老年代采用标记-压缩或标记-整理算法。内存分配的策略会影响垃圾收集的效率和程序的响应速度。 ### GC(垃圾回收) 垃圾回收是JVM自动管理内存的关键特性...

    全面了解JVM组成底层工作原理以及数据结构

    JVM(Java虚拟机)是Java平台的核心组件之一,它为Java程序提供了一个独立于硬件平台的运行环境。JVM的主要任务是解释字节码,将其转换为对应平台的机器码执行。在深入探讨JVM之前,让我们先了解一下它的几个重要...

Global site tag (gtag.js) - Google Analytics