java 基本功 —— 内存相关

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

首先我们来说说内存,因为从内存的角度来出发来分析一些变量,引用或者对象的生命周期会更好理解一些。

java是一门编程语言,他跟C++有什么不同呢?本质上,他们都是一样的,殊途同归。因为底层都是操作内存和磁盘的工具,只是语法不同,表现形式不同而已。

所以有的时候不必刨根问底,因为这可能只是语言的一种规则而已。

java中都是以对象和对象的引用形式来操作数据的,那么java中是如何分配这些存储引用和内存的呢?

 

一、 java 中的内存块

1. 寄存器。这是最快的存储区,以为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限,所以寄存器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象。

2. (又名堆栈),原型就是碟盘子模型,先放的盘子后拿。栈位于通用RAM(随机访问存储器)中,但通过堆栈指针可以直接从处理器那里获得直接支持。通过栈顶指针的上下移动来创建和释放内存,这是一种快速有效的分配存储的方法,仅次于寄存器。但是这种方式,java系统必须知道存储在堆栈内所有项的生命周期,以便上下移动堆栈指针。所以对象的引用存在与堆栈中(因为由确切的生命周期),但是对象不会存于堆栈中(无确切的生命周期)。

3.。一种通用的内存池,也是位于RAM区,用于存放所有的java对象。堆不同与堆栈的好处是:编译器不需要知道存储的数据在堆里存活多长时间。因此,在堆里分配存储由很大的灵活性。当需要一个对象时,只需new一个,当执行时,会自动在堆里进行分配内存。当然,为了这种灵活性必须付出相应的代价:用堆进行存储分配和清理可能比用堆栈进行存储分配需要更多的时间。(对比于C++,对象会在栈中存储,因为对象的生命周期都是程序员自己控制的)

4.常量存储。常量值通常直接存放在程序代码的内部。

5.非RAM存储。如果数据完全存活于程序之外,那么可以不受程序的任何控制,在程序没有运行时也可以存在。其中两个基本的例子就是流对象和持久化对象。在流对象中,对象转化成字节流,通常被发送给另一台机器。在持久化对象中,对象被存放于磁盘上,因此,即使程序终止,他们仍可以保持自己的状态。这种存储方式的技巧在于:把对象转化成为可以存储在其他媒介上的事物,在需要时,可恢复成常规的、基于RAM的对象。java提供了对轻量级持久化的支持。

二、基本类型在栈中

java对于小的,基本的变量是这样处理的:

将他们固定长度,直接存储值于堆栈中,所以java的基本类型都是有固定取值范围的。

java基本类型长度不变也是java的可移植性的重要原因。

三、对象的生命周期

变量的生命周期往往是由大括号决定的,而对象则不然

{

    String s = new String("a  string");

}

在上面的这段代码中,引用s在作用域终点就消失了。然而,s指向的String对象仍然继续占据着内存空间。

我们已经无法在作用与之外访问这个对象,因为他唯一的引用已经失效了。

事实证明,由new创建的对象,只要你需要,就会一直保留下去。

那么他们什么时候消亡,以至于不会填满内存呢?这就引出了垃圾回收器

垃圾回收器的作用:监视new创建的所有对象,并辨识哪些对象是不会再被引用的对象,随后,释放这些对象的内存空间,以便供其他新的对象使用。所以对象不需要程序员自己回收。神奇的GC...

三、有关static

class StaticTest {

    static int i = 47;
}

即使你创建了两个StaticTest对象,StaticTest.i也只有一份存储空间,这两个对象共享一个i。

StaticTest st1 = new StaticTest();

StaticTest st2 = new StaticTest();

在这里,st1.i和 st2.i指向同一存储空间,因此他们具有相同的值47.

所以static字段对每个类来说只有一份存储空间,而非static字段则是对每个对象有一个存储空间。

 

转载于:https://my.oschina.net/u/2561483/blog/707913

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458285.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DOM事件处理有三个阶段

DOM事件处理有三个阶段: 捕捉阶段(capture phase):从最上层元素,直到最下层(你点击的那个target)元素。路过的所有节点都可以捕捉到该事件。命中阶段(target phase)&…

客户端程序自动更新(升级)的方式

from:https://blog.csdn.net/woaitingting1985/article/details/72954652一、C/S自动更新原理C/S程序自动升级是一个很重要的功能,原理其实很简单,一般包含两个程序一个是主程序,也就是除了升级功能以外的程序,另一个就…

怎么用源程序把ChemDraw结构复制到Word文档

在学习化学过程中,不可避免的会接触到各种化学结构。这个时候就需要通过绘制化学结构来进行这方面的学习和传播。ChemDraw Professional 15就可以辅助完成这方面的工作。很多的用户朋友会通过选中后复制粘贴可以将ChemDraw结构复制到Word文档中,但这只是…

网络流(最大流) HDU 1565 方格取数(1) HDU 1569 方格取数(2)

HDU 1565 方格取数(1)给你一个n*n的格子的棋盘,每个格子里面有一个非负数。从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大。 Input 包括多个测试实例&#…

python学习 第一篇 基础

上周报名了reboot python 课程,终于下决心要把python 搞好了,希望自己能坚持下来,并得到自己想要的成绩#coding:utf-8 #呵呵 #print hello world #xhello world #print x #xraw_input(hello world) #print x #int #print 23 #print 12*3 #pri…

QT串口编程的相关类(QSerialPortInfo)

QT Serial Port相关的类只有两个QSerialPortInfo(#include<QSerialPortInfo>) 和QserialPort(#include<QSerialPort>) 先来介绍QSerialPortInfo 1&#xff1a;QSerialPortInfo(#include<QSerialPortInfo>) 该类是一个串口的辅助类类&#xff0c;提供主要是提…

用jquery写一个属于自己的音乐播放器

看到一个用css3实现的CD的动画&#xff0c;演示在这儿http://codepen.io/_kieran/pen/QNRmep 突然那我就想说给自己做一个音乐播放器吧&#xff0c;说做就做。演示在https://echolsx.github.io/music/ Github传送门&#xff1a;https://github.com/EchoLsx/music 主要代码&…

四年一闰 随笔

今天日子比较特殊&#xff0c;碰到闰年的2月29日。好久没有记录随笔了&#xff0c;今天随便记上几笔吧 1、上家公司居然没帮我交社保&#xff0c;一整年了&#xff0c;发工资时还照扣社保的钱。。。现在说会补差额给我&#xff0c;算下来一年XXXX&#xff0c;也只是个数字&…

Qt 串口类QSerialPort 使用笔记

Qt 串口类QSerialPort 使用笔记虽然现在大多数的家用PC机上已经不提供RS232接口了。但是由于RS232串口操作简单、通讯可靠&#xff0c;在工业领域中仍然有大量的应用。Qt以前的版本中&#xff0c;没有提供官方的对RS232串口的支持&#xff0c;编写串口程序很不方便。现在好了&a…

什么是H标签?H1,H2,H3标签?以及和strong标签使用的方法及重要性

大家都知道&#xff0c;seo的一个很重要的一点就是要把网站做的条理清晰&#xff0c;让搜索引擎很容易的读明白&#xff0c;这个条理清晰不仅体现在网站的物理路径&#xff0c;url等地 方。在<h1><h2><h3>等方面也是这样。并不是<h1>对于关键字排名有帮…

OC语言中的便利初始化函数和便利构造器

便利遍历初始化函数与便利构造器&#xff08;以Student类为例&#xff09;&#xff1b; main函数 Student.h&#xff08;声明&#xff09; 。。。。。。。。。。。。。。。。。。。 Student.m&#xff08;实现&#xff09; 。。。。。。。。。。。。。。。。。 转载于:https://…

MySQL 性能监控 4 大指标

【编者按】本文作者为 John Matson&#xff0c;主要介绍 mysql 性能监控应该关注的 4 大指标。 文章系国内 ITOM 管理平台 OneAPM 编译呈现。 MySQL 是什么&#xff1f; MySQL 是现而今最流行的开源关系型数据库服务器。由 Oracle 所有&#xff0c;MySQL 提供了可以免费下载的社…

【深度相机系列四】深度相机原理揭秘--结构光(iPhone X 齐刘海原理)

from&#xff1a;https://blog.csdn.net/electech6/article/details/78707839导读 结构光法&#xff1a;为解决双目匹配问题而生 深度图效果&#xff1a;结构光vs.双目 投射图案的编码方式直接编码时分复用编码空分复用编码 Kinect1原理 iPhone X原深感相机是缩小版的更强大的K…

iOS开发中对于一些常用的相对路径(持续更新)

1.iOS开发的证书的描述文件放置地点 ~/Library/MobileDevice/Provisioning Profiles 2.$(SRCROOT)代表的是这个项目文件夹所在的位置 $(PROJECT_DIR) 表示的包含可执行文件的哪一个文件夹 3.对于pod导入的第三方库&#xff0c;引用不自动补全问题。选择target -> BuildSet…

Android倒计时工具类

为什么80%的码农都做不了架构师&#xff1f;>>> 原文地址:http://my.oschina.net/reone/blog/710003 多谢touch_ping 的回应. 原来api有这个类 android.os.CountDownTimer , 具体实现很下面的差不多. import android.content.Context; import android.os.Handler…

深度相机原理揭秘--双目立体视觉

欢迎关注计算机视觉life&#xff01;导读 为什么非得用双目相机才能得到深度&#xff1f; 双目立体视觉深度相机的工作流程 双目立体视觉深度相机详细工作原理理想双目相机成像模型极线约束图像矫正技术基于滑动窗口的图像匹配基于能量优化的图像匹配 双目立体视觉深度相机的优…

微信扫码支付模式一和模式二的区别

http://www.baidu.com/link?urlAj_xhOM5Q6rpZXkTMBPq4o0UbCO4eLq0esX8B3K2v06bkRS8F8lC4k06rv-3uZARLLTEKJHMhwzI_cdcJiHfqK&wd&eqid904bc71f000181740000000356d7d9bf https://www.zhihu.com/question/35818812/answer/66086727 知乎页面访问存在502 Bad Gateway问题…

双目视觉几何框架详解(玉米专栏8篇汇总)

一、图像坐标&#xff1a;我想和世界坐标谈谈(A) 玉米竭力用轻松具体的描述来讲述双目三维重建中的一些数学问题。希望这样的方式让大家以一个轻松的心态阅读玉米的《计算机视觉学习笔记》双目视觉数学架构系列博客。这个系列博客旨在捋顺一下已标定的双目视觉中的数学主线。数…

(原)Ubuntu14中安装GraphicsMagick

转载请注明出处&#xff1a; http://www.cnblogs.com/darkknightzh/p/5661439.html 参考网址&#xff1a; http://comments.gmane.org/gmane.comp.video.graphicsmagick.core/514 http://www.graphicsmagick.org/INSTALL-unix.html https://github.com/clementfarabet/graphics…

js全局函数

1.parseInt(String,radix):返回转换成整数的值。 注意&#xff1a;当参数radix的值为0&#xff0c;或者没有设置这个参数&#xff0c;parseInt()会根据string来判断数字的基数。 当忽略radix&#xff0c;JavaScript默认数字的基数规则为&#xff1a; 1.如果string以0x开头&…