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

JVM的内存管理 Ⅰ

    博客分类:
  • JVM
阅读更多

 

转自:青竹少年

最近在看Java优化这方面的书,那必然会涉及到内存管理,我想和大家共同提高,于是写出来,如果有问题,希望能提出来,共同进步嘛!呵呵,不说这些了,好,现在开始你的知识之旅吧!

      在做Java开发的时候常用的JVM内存管理有两种,一种是堆内存,一种是栈内存。堆内存主要用来存储程序在运行时创建或实例化的对象与变量,例如:我们通过new MyClass()创建的类MyClass的对象。而栈内存则是用来存储程序代码中声明为静态(或非静态)的方法。下面我给大家举个例子:

 

 public class Test{
 2      static Vector list = new Vector();
 3      static void makeThings(){
 4           Object object = new Object();
 5           list.add(object);
 6       }
 7       public static void main(){
 8             makeThings();
 9       }
10 }

 就拿上面的例子来说,放在栈内存中的有:main,makeThings,放在堆内存中有:Test,list,object。

 

      JVM中对象的生命周期大致可以分为7个阶段:创建阶段、应用阶段、不可视阶段、不可到达阶段、可收集阶段、终结阶段与释放阶段。

      1.创建阶段:
        (1)为对象分配存储空间。

        (2)开始构造对象。

        (3)递归调用其超类的构造方法。

        (4)进行对象实力初始化与变量初始化。

        (5)执行构造方法体。

      还有就是你在创建对象的时候需要注意的地方:

        (1)避免在循环体中创建对象,即使该对象占用内存空间不大。

        (2)尽量及时使对象符合垃圾回收标准。

    (3)不要采用过深的继承层次。

    (4)访问本地变量优于访问类中的变量。

     2.应用阶段:

     在应用阶段涉及到4个引用:

          (1)强引用:是指JVM内存管理器从根引用集合出发遍寻堆中所有到达对象的路径。

    (2)软引用:是具有较强的引用功能,只有当内存不够的时候,才回收这类内存,因此内存足够的时候,不会被回收。

    (3)弱引用:弱引用与软引用对象的最大不同在于:GC在进行回收时,需要通过算法检查是否回收软引用对象,而对于弱引用来说,GC总是进行回收。

    (4)虚引用:主要用于辅助finalize函数的使用。虚引用主要适用于以某种比Java终结机制更灵活的方式调度pre-mortem清除操作。

     3.不可视阶段:

        先看一段代码:

 

public void process(){
 2     try{
 3         Object obj = new Object();
 4         obj.doSomething();
 5     }
 6     catch(Exception e){
 7         e.printStackTrace();
 8     }
 9     while(isLoop){
10         //这个区域对于obj对象来说已经是不可视的了
11         //因此下面的代码在编译时会引发错误
12          obj.doSomething();
13     }
14 }
   如果一个对象已使用完了,应该主动将其设置为null,可以在上面的代码行obj.doSomething();下添加代码行obj=null;这样一行代码强制将obj对象置为空值,这样做的意义就是帮助JVM及时的发现这个垃圾对象,并且可以及时的回收该对象占用的系统资源。

 

    4.不可到达阶段:

       处于不可到达阶段的对象,在虚拟机所管理的对象引用根集合中再也找不到直接或间接的强引用,这些对象通常是指多有线程栈中的临时变量,所有已装载的类的静态变量或者对本地代码接口(JNI)引用。

    5.可收集阶段、终结阶段与释放阶段:

   当对象处于这个阶段的时候,可能处于下面三种情况:

          (1)垃圾回收器发现该对象已经不可到达。

     (2)finalize方法已经被执行。

     (3)对象空间已被重用。

      当对象处于上面三种清空的时候,虚拟机就可以直接将该对象回收了。

 

分享到:
评论

相关推荐

    《Java核心技术卷Ⅰ》笔记

    Java通过自动垃圾回收机制管理内存,避免了手动管理带来的错误。 - **即时编译**:Java虚拟机(JVM)具备即时编译功能,能够将频繁使用的字节码动态转换为机器码,以提升执行效率。 - **数据类型的固定大小**:Java...

    Java核心技术 第八版 卷Ⅰ(基础篇)

    4. **内存管理与垃圾收集**:讲解了Java虚拟机(JVM)如何进行内存分配和垃圾回收,以及如何理解和避免内存泄漏问题。 5. **集合框架**:涵盖了Java集合接口(如List、Set、Map)和实现类(如ArrayList、LinkedList...

    java简介,关于Java入门方面的

    Java的内存管理由垃圾回收机制自动处理,提高了程序的安全性和可靠性。此外,Java的类库比C++更强大,尤其是在网络和图形用户界面方面。 学习Java,可以从了解其基本语法、类和对象开始,然后逐步深入到集合框架、...

    JavaSE基础学习笔记2020.pdf

    平台无关性是指Java程序可以在安装了不同平台的Java虚拟机(JVM)上运行,而自动内存管理指的是Java的垃圾回收机制能自动管理内存资源。 3. Java开发环境:为了开发Java程序,需要配置Java开发环境,包括安装JDK、...

    JavaCore:Core Java VolumeⅠ和Ⅱ的源代码

    10. **JVM内部机制**:了解JVM的工作原理对优化代码性能至关重要。包括类加载机制、内存模型(堆、栈、方法区、本地方法栈等)、垃圾收集机制等。 在"JavaCore-master"这个压缩包中,很可能是包含这些章节的源代码...

    Java2核心技术第6版卷1基础知识.rar

    其设计目标是具有简单的语法、健壮的内存管理以及高效的安全特性。 2. **环境配置**:介绍如何安装Java Development Kit (JDK)、设置环境变量(如JAVA_HOME、PATH和CLASSPATH),以及使用Java编译器(javac)和解释...

    corejava源码-CoreJavaVolume:Java核心技术卷Ⅰ、Java基础学习练习源代码仓库

    12. **JVM原理**:垃圾回收机制、内存模型、类加载器等,虽然这部分不是源码直接涉及的,但理解这些有助于优化程序性能。 这个源码仓库中的"CoreJavaVolume-master"很可能包含了上述所有主题的实例代码,可以帮助...

    Java学习必须看的书籍

    通过学习本书,你可以掌握如何优化Java应用程序的性能,并更好地理解JVM是如何管理内存和执行代码的。 #### 九、《稳健的Java:异常处理、测试和调试》(Robust Java: Exception Handling, Testing, and Debugging...

    JAVA上百实例源码以及开源项目源代码

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    Java经典入门教程pdf完整版

    周期管理PLM、面向服务体系架构SOA、商业智能BⅠ、项日管理PM、营销管理、流程管 理 Work Flow、财务管理…..等几乎所有你能想到的应用 3:嵌入式设备及消费类电子产品 包括无线手持设备、智能卡、通信终端、医疗设备...

    java开源包1

    JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的...

    java开源包11

    JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的...

    java开源包2

    JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的...

    java开源包3

    JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的...

    java开源包6

    JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的...

    java开源包5

    JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的...

    java开源包10

    JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的...

    java开源包4

    JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的...

    java开源包8

    JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的...

    java开源包7

    JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的...

Global site tag (gtag.js) - Google Analytics