`
Icgemu
  • 浏览: 71540 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

关于class的GC问题

    博客分类:
  • Java
JVM 
阅读更多

源文见:http://www.iteye.com/problems/8266

 

首先要区分清code和data。以后JVM很可能会有新的机制来允许方法(code)被GC,例如说通过新的AnonymousLoader、MethodHandle等机制。但就现在的JVM来说,code一旦被ClassLoader给load进来之后就放在PermGen heap上,基本上直到程序终止前都不会被GC了。据说Java 6 Update 4还是多少开始有个新的启动参数,-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses,不过没仔细看不知道到底能达到怎样的效果。 

Java中的code是以类为单位保存在class文件里的。Class文件里含有类的名称、继承关系、常量池,以及各个静态/成员方法的字节码。JVM在加载程序的时候也是以类为单位来加载的,code会被加载到称为"Permanent Generation"(PermGen)的堆上。 

类的静态变量是在其被加载时先分配空间(可以认为也是在PermGen里),然后初始化。其生命周期与类的code的生命周期一样长。 
成员变量则是在new新的实例时分配空间,并由默认初始化器和构造器等初始化。其生命周期与实例的周期相关。注意这里说的生命周期是单纯指primitive type或者reference自身,而不包括reference指向的对象。举例来说,假如一个实例a的成员x被赋为null了,那么这个null值仍然要保存在a里,在32位系统上这就意味着至少占用了4个字节。 

方法中的局部变量概念上说是在栈上分配空间的,其生命周期与方法调用的周期一样,也就是说方法调用过后空间就会被回收。注意这里指的同样是primitive type或者reference自身,而不包括reference所指向的对象。再举个例子的话,假如在方法里有这么一句:

Java代码:
  1. String s = new String("abc");  

则"abc"是在常量池里分配空间的,s现在所指向的刚new出来的对象(作为一个实例)是在第0代堆里分配空间,而s(作为一个引用)自身概念上是在栈上分配空间的。方法结束时,s自身的空间会被回收,但s所指向的对象是否被回收取决于是否还存在指向它的活引用。 

之所以说是“概念上在栈上分配空间”是因为JVM有可能会将局部变量优化为直接分配在寄存器上,不过这是实现细节,对上层的程序员并没有可见的影响。 

基本上就是这样吧……

分享到:
评论

相关推荐

    gc2145 mipi 驱动

    这通常通过在驱动的初始化函数中调用`device_add()`和`class_create()`完成。 3. **HAL层实现**:在Android框架层,需要编写HAL层代码,实现Java层与驱动的交互。这包括创建对应的Camera服务,注册到Android服务...

    JVM_GC调优

    - 若Full GC后仍然无法解决问题,则会导致`OutOfMemoryError`。 2. **元空间** - Java 8中引入的新概念,将类的元数据存储在本地内存中,而非堆中。 - 提高了类加载的速度和效率。 #### 七、结论 通过对JVM_GC...

    Java GC与性能调优

    Java GC与性能调优 Java GC与性能调优是 Java programming language 中非常重要的一部分,直接影响着 Java application 的性能。本文档将对 Java GC 与性能调优进行详细的介绍。 一、 Java 平台的逻辑结构 Java ...

    java.io.InvalidClassException local class incompatible 处理方法

    ### Java.io.InvalidClassException Local Class Incompatible 解决方案 在Java序列化过程中,经常会遇到`java.io.InvalidClassException`异常,特别是在序列化类时如果类的版本与反序列化环境中的类版本不一致的...

    jdk 1.6 gc详解

    本文将深入探讨JDK 1.6中的GC工作原理、内存分配策略以及如何进行问题排查和调优。 首先,理解GC的基本概念,其主要任务是识别并回收那些无引用指向的对象,即所谓的"dead"对象。Hotspot JVM在内存分配上有三种主要...

    CLASS-VP 6.14

    岛津CLASS-VP是一款广泛应用于科学分析领域的数据系统,尤其是化学分析仪器如液相色谱(HPLC)、气相色谱(GC)等。它提供了数据采集、处理、报告生成等一系列功能,使得实验数据的管理和分析更加高效和准确。在描述...

    gc2145_parrotv1.1_r16m_验证完成_20170523_1408没有外层目录.7z

    全志R16的android4.4.2平台点亮gc2145(evb30) 版本:V1.1 1、配置ov2640在android层配置的分辨率为vga(预览/拍照/录像) 注意:系统自带的快拍APP就在这里查找分辨率参数发送到camera的HAL层。 这里得分辨率...

    2022年关于GC——Dotnet中Dispose的设计模式C语言教程.docx

    public class SampleClass : System.IDisposable { public void Dispose() { Dispose(true); // 阻挡GC调用析构函数,因为已经手动调用Dispose System.GC.SuppressFinalize(this); } protected virtual void...

    JVM内存管理-GC模型-编写GC友好的代码.pdf

    ### JVM内存管理与GC模型详解 #### 一、引言 在现代软件开发中,Java虚拟机(JVM)作为一种广泛使用的平台,其内部机制尤其是内存管理和垃圾收集(GC)模型,对提升程序性能和稳定性至关重要。本文将深入探讨Sun ...

    gc2145_tinav2.1验证完成20170523_1648.7z

    UNICODE 全志R16平台TINAV2.1下的CSI接口摄像头ov5640的配置v1.2.txt R16_Camera模块开发说明文档_V1.8.pdf 所有步骤请按照这个说明书执行 ...解决重启的问题) [pmu1_para] …… ;power_start ...

    java易混淆概念Anonymous Inner Class

    Java 易混淆概念 Anonymous Inner Class Java编程语言中存在一些易混淆的概念,今天我们将探讨 Anonymous Inner Class、final、finally、finalize 的区别,...GC 的存在使得 Java 程序员不用担心内存管理的问题。

    JVM体系结构与GC调优

    5. **GC日志分析**:开启GC日志,通过`-XX:+PrintGCDetails`和`-XX:+PrintGCDateStamps`等参数,记录并分析GC的运行情况,找出可能的问题。 6. **内存泄露检测**:检查是否有长期存活的对象,导致内存无法释放。...

    JDK10GC-cheatsheet.pdf

    JDK10的垃圾收集(GC)调优是Java开发者关注的重要领域,因为GC性能直接影响应用的稳定性和响应速度。本篇文章将详细解读JDK10中的GC参数及其作用。 首先,我们关注到Application Class Data Sharing(CDS)功能。...

    JVM-GC全面知识系统详解

    Java虚拟机(JVM)是Java程序运行的基础,它的核心组成...了解这些内容,可以有效避免内存溢出、提高应用响应速度,并能更好地应对多线程环境下的数据同步问题。对于Java开发人员而言,这些都是不可或缺的专业技能。

    Java虚拟机GC日志分析

    Java虚拟机GC日志分析是Java开发者不可或缺的一项技能,通过对GC日志的分析,可以了解Java虚拟机中的内存使用情况,避免内存溢出和性能问题。本文将对Java虚拟机GC日志分析进行详细的介绍,并提供相关代码示例。 一...

    org.eclipse.swt.win32

    org.eclipse.swt.graphics.GC.class org.eclipse.swt.graphics.GCData.class org.eclipse.swt.graphics.GlyphMetrics.class org.eclipse.swt.graphics.Image.class org.eclipse.swt.graphics.ImageData.class org....

    SWT GC 五子棋

    public class FiveChess extends BaseWindow{ private Listener listener; private Canvas canvas; private Rectangle clickArea; private static int N=20; private static int DIV=15; private Rectangle[]...

    java8看不到源码-visualgc_java8:适用于Java8+的Visualgc补丁和适用于IDEA的Visualgc

    class loader. It can monitor both local and remote JVMs. visualgc_fix 使用原始visualgc 代码进行最小修复以在Java 8 下运行 visualgc_java8 修复visualgc 运行并添加更多gc 细节 visualgc_idea 一个嵌入了...

    General Code Class Library

    无论是进行多线程编程,还是处理进程间的通信问题,这个库都能提供有力的支持,极大地提升了开发者的生产力。对于希望提升软件质量和开发效率的团队而言,"General Code Class Library" 是一个值得信赖的选择。

Global site tag (gtag.js) - Google Analytics