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

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

代码

1 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.不可视阶段:

先看一段代码:

代码

1 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)对象空间已被重用。

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

好了,总算写完了。希望对大家有益。

转载于:https://www.cnblogs.com/andrewhan/archive/2010/12/04/blan.html

JVM的内存管理 Ⅰ相关推荐

  1. Java虚拟机JVM的内存管理

    Java虚拟机JVM的内存管理 关键词 一.JVM整体架构 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 名称 作用 特征 配置参数 异常 程序计数器 ...

  2. 解析Java对象引用与JVM自动内存管理(2)

    解析Java对象引用与JVM自动内存管理(2) 作者:杨扬 本文选自:赛迪网 2002年11月22日 Soft References 应用实例 下面以在基于web的应用程序中使用soft refere ...

  3. JVM的内存管理机制详解

    一.为什么要学习内存管理? Java与C++之间有一堵由内存动态分配和垃圾回收机制所围成的高墙,墙外面的人想进去,墙里面的人出不来 对于Java程序员来说,JVM给我们提供了自动内存管理机制,不需要既 ...

  4. 第五篇:初识JVM,JVM自动内存管理

    文章目录 一.前言 1.1 计算机==>操作系统==>JVM 1.1.1 虚拟与实体(对上图的结构层次分析) 1.1.2 Java程序执行(对上图的箭头流程分析) 二.JVM内存空间与参数 ...

  5. 一、JAVA虚拟机------JVM自动内存管理

    JVM自动内存管理 一.JAVA内存区与内存溢出 1.1 概述 1.2 运行时数据区 1.2.1 程序计数器 (Program Counter Register) 1.2.2 Java虚拟机栈(Jav ...

  6. JVM自动内存管理机制——Java内存区域(下)

    一.虚拟机参数配置 在上一篇<Java自动内存管理机制--Java内存区域(上)>中介绍了有关的基础知识,这一篇主要是通过一些示例来了解有关虚拟机参数的配置. 1.Java堆参数设置 a) ...

  7. 读书笔记——深入理解JVM(JVM自动内存管理)

    简介 本系列为<深入理解Java虚拟机-JVM高级特性与最佳实践>一书的阅读笔记. 本书开头介绍了JVM发展的历史,接着介绍了JVM是如何实现自动内存管理的. 本章节主要介绍: JVM的存 ...

  8. JVM 自动内存管理

    JVM Java 内存区域 虚拟机栈 栈帧的组成 动态分派 栈可能会引发的问题 基于栈的解释执行 本地方法栈 程序计数器 堆 分区 内存分配机制 方法区 元空间与永久区 运行时常量池 直接内存(堆外内 ...

  9. Java JVM与内存管理

    1.JVM内存区域划分(程序计数器.java堆.java虚拟机栈.本地方法栈.方法区) 程序计数器 一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器. 如果线程正在执行的是一个 ...

最新文章

  1. Spring Cloud Gateway——2020.x以上版本HTTP 503 或 NoLoadBalancer[负载均衡]解决方案
  2. 前端学习(707):循环小结
  3. flume mysql hdfs_利用Flume将MySQL表数据准实时抽取到HDFS
  4. 【蓝桥杯每日一练】 斐波那契数列
  5. Access to the path ‘‘ is denied.解决方案
  6. su封面插件_儿豁嘛,这就是SU空间布线葵花宝典
  7. 鸿蒙2.0内测版手机版,不再遮遮掩掩,鸿蒙2.0测试版下月发布,用于手机内测
  8. 苹果机装w ndows糸统,苹果电脑安装win系统一键安装教程
  9. Hive ANALYZE NOSCAN
  10. 什么是抗攻击服务器?抗攻击服务器是如何防御攻击的?
  11. 区块链随机数-区块链随机数的实现方案
  12. Web 应用防火墙如何添加域名
  13. PhoneGap移动开发框架2
  14. 聚焦分布式资本:中国首家区块链基金如何布局区块链
  15. java鼠标各按键单击和左键击双击
  16. 辉光管升压电路理论,让USB升压170V
  17. MySQL 条件查询
  18. 射影几何 -- 平面射影几何 2
  19. 两复数乘积C语言,C语言程序(两复数矩阵相乘)改错求助
  20. 中国三大运营商3G工作频率/频点及速率

热门文章

  1. 线下社群要如何拉新呢?
  2. 大到创业,小到做一份副业
  3. 如何在工作中学习,让自己成为领域专家?
  4. 一位网友在某职业论坛上就发了一个相关的帖子
  5. 怎样知道别人在蹭我家wifi?
  6. Apple’s current market value is more than two trillion
  7. 解决 Block-scoped declarations (let, const, function, class) not yet supported outside strict mode at
  8. t–sql pl–sql_糟糕SQL查询设计– SQL查询性能的杀手–基本知识
  9. 使用SSIS包将多个Excel文件中的数据导入SQL Server表中
  10. azure 导入 bak_使用Azure Data StudioSQL Server数据导入