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

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

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

java 基本功 —— 内存相关相关推荐

  1. java non-heap_成都汇智动力-Java内存相关

    原标题:成都汇智动力-Java内存相关 Java内存模型 可见性:一个线程对共享变量值的修改,能够及时地被其他线程看到.语言层面上支持两种 synchronized 和 volatile. 共享变量: ...

  2. Java基本功一之JDK配置Java基本语法

    前言 从事工作也已经2年多了,一直以来看到别人写博客的热情和坚持的毅力,因此准备开篇写下<Java基本功>系列博客:也算是对自己JAVA基础知识的回顾,因为工作久了,业务上的东西做的越来越 ...

  3. Java 虚拟机内存模型

    一.前言 Java 虚拟机,简称 JVM(Java Virtual Machine),是 Java 语言中最为核心的一个东西,Java 程序运行离不开它,因为它的存在,使得 Java 拥有" ...

  4. java 全局变量 内存不回收_Java的内存 - 内存回收

    这篇承接上一篇 <Java的内存 - 内存模型>,分析内存回收相关的知识点. 垃圾回收包含两个步骤,①标记哪些内存是垃圾 ②回收内存.下面分别说这两个步骤有哪些算法: 1. 垃圾标记 1. ...

  5. Java控制内存的功力

    卷首语: 本文选自<Java程序员,上班那点事儿>第4章 控制内存的功力 那本谭浩强主编的Java入门教材说: -- Java的语言特点: -- 4.健壮性 -- Java用真正的数组代替 ...

  6. java堆算法,Java 基本功04-JVM-Java堆详解和GC算法

    JVM GC 机制 1. 在此之前需要了解相关概念: 1.1 Java 堆内存: 在 HotSpot JVM 实现中 Heap 内存被"分代"管理. JVM 的内存首先被分割成两部 ...

  7. Java常见内存溢出(OOM)解决方案

    Java 常见内存溢出(OOM)解决方案 一,jvm内存区域   1,         程序计数器 一块很小的内存空间,作用是当前线程所执行的字节码的行号指示器. 2,         java栈 与 ...

  8. Java 基本功之(一)入门知识点

    转载自https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/basis/Java%E5%9F%BA%E7%A1%80%E7%9F% ...

  9. 十分良心!全网最详细的Java 自动内存管理机制及性能优化教程

    同样的,先来个思维导图预览一下本文结构. 一图带你看完本文 一.运行时数据区域 首先来看看Java虚拟机所管理的内存包括哪些区域,就像我们要了解一个房子,我们得先知道这个房子大体构造.根据<Ja ...

最新文章

  1. 地平线机器人提出Anchor free、NMS free的3D目标检测算法 | CVPR2020 Workshop
  2. Data truncation: Data truncated for column/Data too long for column
  3. springbot集成finereport后在web中使用iframe引用报表
  4. Phython—实训day5—爬虫相关知识
  5. 深度 | 一篇文章带你进入无监督学习:从基本概念到四种实现模型(附论文)
  6. 自定义指令监听多个div_Vue 3 | 自定义指令的新玩法
  7. 转数组_Java中IO必杀技-文件转字节数组
  8. 【微软推荐】结合知识的推荐系统.pdf(附下载链接)
  9. android 签名报错,AndroidStudio生成签名apk报错
  10. 我❤️—Python自动化测试,30岁熬到月薪20K+,分享我的多年面试经…
  11. leetcode 20. 有效的括号
  12. 超赞 ! 老外的一种避免递归查询所有子部门的树数据表设计与实现!
  13. 用什么软件写html语言,写html代码用什么软件
  14. jsp分页功能的位置有可能会影响到翻页时的查询条件
  15. office visio 替代_10 个 Linux 中最好的 Visio 替代品
  16. 如何使用计算机上合并计算方法,excel如何使用合并计算
  17. 安卓Android校园综合服务系统校园帮app
  18. 安徽省太和一中2021高考成绩查询分数,2021届安徽省太和一中高三物理高考二模试题 Word版含答案...
  19. 吉首大学新星杯——小阳数数
  20. 一文读懂元宇宙--元宇宙技术及技术瓶颈

热门文章

  1. 最容易进的大厂工作,百度经典百题
  2. UNIX(多线程):20---生产者消费者实例
  3. C++(4)--初识变量、数据类型
  4. MachineLearning(8)-PCA,LDA基础+sklearn 简单实践
  5. Github(1)-概览,初始化仓库
  6. 简单了解linux,linux简单了解
  7. 计算机操作系统 死锁问题
  8. C++ Vecctor容器浅析
  9. C++学习 优雅的实现对象到文件的序列化/反序列化 关键字serialize
  10. 软件开发者最重要的四大技能