让你第一次认识到Java的内存管理
发现之前写的可读性不好,这次准备试试换风格,去掉长篇大论,觉得这个风格好的,麻烦点个赞啦
清理、JVM的妙处
大家以后都是程序员,假设你很不幸,需要自己交钱租房子。
你作为一个小穷人,租的房子到期了(万一是你跳槽去了其他地方,滑稽),房子就要还给房东。
在很久之前,**房东C++**是个好人,等着房客主动来还房子,然后再把房子租出去(析构)。
这里C++只是说在堆上分配内存,而不是栈,求C++大佬们放过!!对不起!
后来叫Java的也来做了房东,Java很有钱,他有一栋大楼的房子,Java会给所有的租客一个叫内存的卡(new操作):
- 在客户多的时候,定期给租期还没到的人发新卡分配住处
- 在客户少的时候,Java就会喊所有人以及他认识的租客(活对象、引用链)来前台,给他们的卡上做个标记,这时溜号的人就没有这个标记,然后Java会把没有这个标记的人的房间重置用来下次租。
上面两种方式就是C++中的析构(还房子)与**Java的内存管理方式——垃圾回收(GC)**中的两种方式“停止-复制”与“标记-清扫”。
但是,Java有一些客户,是从C++和其他房东那里,借用客户的关系挖来的,他们的房子并不是领卡的(不用new的方式获得内存),或者做了其他影响全局的操作,比如给门上画了涂鸦(如”绘图“)。这Java就头疼了,但是聪明的Java也有他的办法,Java允许他的客户有一个私人的小服务员finalize(),这个客户走的时候,就会招呼这个服务员,这个服务员就在房间里面等着,Java老板来了的时候,服务员就开始干房客交待的事情。同时大老板Java在自己的F-Queue队列小本上记上这个房间,先去回收没有服务员的房间去了,稍后再来看这个房间。诶,万一这个房客交待服务员finalize()做的事情,是把房间送给其他的房客(重新与引用链上的对象建立关联),那我们就不能回收了对吧,一个房间就“起死回生”,Java会把它从本本上划去。
看到这里,可以做一个书面总结
- 使用对象需要内存,Java使用了自动的垃圾回收技术,回收由new创建的对象,同时Java语言只能用new初始化对象(注意是Java语言)
- 对象可能不被垃圾回收
- 垃圾回收、finalize()并不等于“析构”
- 垃圾回收只与内存有关。(只是为了腾开空间)
何时使用finalize()方法?
只在回收内存的时候使用,虽然Java会回收所有对象,但是C语言或者其他语言申请的内存空间,Java就束手无策,需要用finalize()方法。
另外,JAVA虚拟机只能保证finalize()方法的执行,但是并不能保证它的完成!(防止阻塞)
除此之外,你还可以?
利用finalize()方法判断当前对象是否能被终结,下面是例子
class Book{
boolean check=true;
protected void finalize(){
if(check)
System.out.println("Error:the check is true");
super.finalize();
}
}
在这个例子中,我们要求书在被删去的时候,check是true,这样不符合的就会打印出错误
这里还使用了super.finalize()方法,super是父类对象的引用,调用这个可以使基类的一些操作也能被执行。
垃圾回收器的初识
C++的内存就像院子,用完了,整个院子都会消失
而Java所有的对象都只能使用new来创建,全部存储在堆上。
这并不会影响Java的速度,因为Java的内存采用的类似传送机一样的结构,Java的堆指针只是简单地移动到未分配的区域,效率很高。同时,垃圾回收器在工作的时候,一面回收空间,一面使堆中对象紧凑排列,这使得Java的内存分配速度十分高速高效。
另外,根据上面谈到的Java回收内存的两种方式,指的是“停止-复制”和“标记清理”,这是Java垃圾回收的四种算法的一部分,其他的不做深度阐述。
让你第一次认识到Java的内存管理的更多相关文章
- Java的内存管理与内存泄露
作为Internet最流行的编程语言之一,Java现正非常流行.我们的网络应用程序就主要采用Java语言开发,大体上分为客户端.服务器和数据库三个层次.在进入测试过程中,我们发现有一个程序模块系统内存 ...
- Java自动内存管理机制学习(一):Java内存区域与内存溢出异常
备注:本文引用自<深入理解Java虚拟机第二版> 2.1 运行时数据区域 Java虚拟机在执行Java程序的过程中把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创 ...
- java jvm内存管理/gc策略/参数设置
1. JVM内存管理:深入垃圾收集器与内存分配策略 http://www.iteye.com/topic/802638 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想 ...
- Java虚拟机内存管理机制
自动内存管理机制 Java虚拟机(JVM)在执行Java程序过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区 ...
- java Hotspot 内存管理白皮书(中文翻译)
转自: http://my.oschina.net/u/568779/blog/166891 1引言 一个健壮的 Java™2平台,Standard Edition (J2SE™)拥有一个自动内存管理 ...
- [基础] C++与JAVA的内存管理
在内存管理上(总之一句话——以后C++工程,一定要用智能指针!) 1.同是new一个对象,C++一定得手动delete掉,而且得时刻记住能delete的最早时间(避免使用空指针).JAVA可以存活于作 ...
- java HotSpot 内存管理白皮书
原文见:http://www.open-open.com/lib/view/open1381034220705.html.查阅资料后,对原文做了补充. 文中关于JVM的介绍基于JDK1.6的Hotsp ...
- Java的内存管理机制之内存区域划分
各位,好久不见.先做个预告,由于最近主要在做Java服务端开发,最近一段时间会更新Java服务端开发相关的一些知识,包括但不限于一些读书笔记.框架的学习笔记.和最近一段时间的思考和沉淀.先从Java虚 ...
- java虚拟机内存管理
1. java虚拟机内存如下 2. 运行时数据区 内存图分析:
随机推荐
- Windows10 JDK1.8安装及环境变量配置
一.下载JDK1.8: 下载地址:https://www.oracle.com/java/technologies/javase-jdk8-downloads.html 二.安装步骤: 我们通常选择 ...
- Python - requests发送请求报错:UnicodeEncodeError: 'latin-1' codec can't encode characters in position 13-14: 小明 is not valid Latin-1. Use body.encode('utf-8') if you want to send it encoded in UTF-8.
背景 在做接口自动化的时候,Excel作为数据驱动,里面存了中文,通过第三方库读取中文当请求参数传入 requests.post() 里面,就会报错 UnicodeEncodeError: 'lati ...
- nes 红白机模拟器 第6篇 声音支持
InfoNES 源码中并没有包含 linux 的声音支持. 但提供 wince 和 win 的工程,文件,通过分析,win 的 DirectSound 发声,在使用 linux ALSA 实现. 先使 ...
- Java自学路线图之Java基础自学
自学Java要从Java基础语法开始自学,自学Java的过程中打好基础是很重要的!首先自学:面向对象基础,API基础,集合基础.这些对Java小白的数学和英语能力的要求门槛不高,在学习的过程中积累相应 ...
- 机器学习实用案例解析(1) 使用R语言
简介 统计学一直在研究如何从数据中得到可解释的东西,而机器学习则关注如何将数据变成一些实用的东西.对两者做出如下对比更有助于理解“机器学习”这个术语:机器学习研究的内容是教给计算机一些知识,再让计算机 ...
- 问题描述:判断一个整数 n 是否为 2 的幂次方
一.2的幂次方的基本定义 什么样的数为2的幂次方?例如2^0=1,2^1=2,2^2=4……,符合公式2^n(n>=0)的数称为2的幂次方. 如何判断一个数是否为2的幂次方呢?基本思路:把一个数 ...
- 【Python】2.12学习笔记 变量
变量 关于变量我有一个不能理解的,关于全局变量作用域与地址的问题,学函数的时候我可能会搞懂它并且写下来 另外,其实昨天说的是有些不准确的,\(Python\)里的变量不是不用声明类型,只是声明方式特殊 ...
- @on-row-click="$emit('on-row-click', arguments[0], arguments[1])" 行内返回事件的一种写法
@on-row-click="$emit('on-row-click', arguments[0], arguments[1])"
- Python接口测试(第一个接口返回的数据作为第二个参数的入参)
python代码如下 import requests url1="http://localhost:8080/pinter/com/getSku?id=1" respon=requ ...
- 基于Ubuntu的ORB-SLAM2项目环境搭建过程
目录 关于ORB-SLAM2 环境搭建 已有环境 创建环境 新建项目目录 安装Pangolin 安装OpenCV 3.2 安装Eigen DBoW2 and g2o (Included in Thir ...