【朝花夕拾】内存拾遗

笔者从事Anroid开发有些年头了,深知掌握Anroid内存方面的知识的必要性,这是一个程序员必须修炼的内功。在面试中,它是面试官的挚爱,在工作中,它是代码质量的拦路虎,可见其重要性。在团队中,内存优化的工作又往往由经验丰富的老师傅来完成,可见要做好内存优化,不是一件容易的事情。

这方面涉及的知识比较多,分析起来也有一定的复杂性,笔者将通过一系列的文章来进行整理,将主要包括JVM,java内存管理,java垃圾回收,android内存管理,android内存优化技巧,android内存泄漏,常用内存分析工具等。由于笔者水平和经验有限,有不当之处,请不吝赐教。

该系列将由以下文章构成,每篇文章针对某一个点进行整理,当然,根据工作中遇到的实际情况,或深或浅,或繁或简。

【朝花夕拾】内存拾遗(一)—— 目录

【朝花夕拾】内存拾遗(二)—— JVM

【朝花夕拾】内存拾遗(三)—— java内存管理

【朝花夕拾】内存拾遗(四)—— java内存回收

【朝花夕拾】内存拾遗(五)—— Android内存管理

【朝花夕拾】内存拾遗(六)—— Android内存优化技巧

【朝花夕拾】内存拾遗(七)—— Android内存泄漏

【朝花夕拾】内存拾遗(八)—— Anroid常用内存分析工具

【朝花夕拾】内存拾遗(九)—— 总结

二、JVM

之所以在讲内存之前先介绍JVM,是因为JVM就像盘古一样开天辟地,在机器上开辟了一个虚拟的空间,然后才有了java生存的土壤。改系列文章的主角——内存就是JVM中的一部分。

1) 什么是JVM?

咱们这里借鉴百度百科的解释:

JVM是Java Virtual Machine 的缩写,即Java虚拟机,它是一种用于计算设备的规范,通过在实际的计算机上仿真模拟各种计算机功能来实现,可以简单理解为,它是一个在实际计算机中虚构出来的寄生计算机。Java源文件经过编译器编译成.class文件(字节码文件)后,由JVM来执行。JVM拥有一套支持java字节码文件(.class文件)执行的环境,可以将.class文件解释成具体平台上的机器指令并执行。Java程序只需要生成.class文件,即可以在任何装有JVM的设备上运行,而不需要理会具体操作系统平台相关的信息。此时的JVM就像一个翻译官一样连接连接着.class文件和系统平台。Java的这个特性叫做平台无关性,实现了“一次编译,到处运行”,JVM就是实现Java这个功能的大功臣。

2) JDK,JRE,JRM是什么关系?

JDK:Java Development Kit 的缩写,即 Java开发工具包,提供了开发java程序所需要的基本条件。上图为JDK的安装包,其中红色边框中

bin:最主要包含了编辑器javac.exe,功能是将java源文件编译为.class文件。

include:包含了Java和JVM交互用的头文件

lib:包含了ava开发所需的类库

jre:为Java运行环境

JRE:Java Runtime Environment的缩写,即Java运行环境,下图为JRE文件夹的内容。注意,JRE是运行环境,而不是开发环境。

bin:可以理解为JVM,其中javaw.exe和java.exe用于执行.class文件

lib:提供了JVM执行所需要的库

JVM:执行.class文件。

这三者的关系可以通过下图(摘自某网站)来理解:JDK包含了JRE,JRE又包含了JVM。图中提到的Java开发工具,集成有类库和编译工具,只需关联jre即可。

原文地址:https://www.cnblogs.com/andy-songwei/p/9291186.html

时间: 2024-10-10 11:55:44

【朝花夕拾】内存拾遗的相关文章

Linux内存拾遗

管理内存是操作系统的核心职责之一.Linux系统把内存分页管理,每一页(page)的大小可以用命令getconf PAGESIZE查看,单位是字节(Byte),Linux默认的页大小为4KB. [root@localhost ~]# getconf PAGESIZE 4096 内存的总体情况可以通过cat /proc/meminfo查看 [root@localhost ~]# cat /proc/meminfo MemTotal:       65751096 kB MemFree:      

.NET基础拾遗(1)类型语法基础和内存管理基础2

二.内存管理和垃圾回收 2.1 .NET中栈和堆的差异? 每一个.NET应用程序最终都会运行在一个OS进程中,假设这个OS的传统的32位系统,那么每个.NET应用程序都可以拥有一个4GB的虚拟内存..NET会在这个4GB的虚拟内存块中开辟三块内存作为 堆栈.托管堆 以及 非托管堆. (1).NET中的堆栈 堆栈用来存储值类型的对象和引用类型对象的引用(地址),其分配的是一块连续的地址,在.NET应用程序中,堆栈上的地址从高位向低位分配内存,.NET只需要保存一个指针指向下一个未分配内存的内存地址

.NET基础拾遗(1)类型语法基础和内存管理基础1

一.基础类型和语法 1.1 .NET中所有类型的基类是什么? 在.NET中所有的内建类型都继承自System.Object类型. 1.2 值类型和引用类型的区别? 在.NET中的类型分为值类型和引用类型,它们各有特点,其共同点是都继承自System.Object,但最明显的区分标准却是是否继承自System.ValueType(System.ValueType继承自System.Object),也就是说所有继承自System.ValueType的类型是值类型,而其他类型都是引用类型.常用的值类型

C++拾遗(十)类与动态内存分配(2)

静态成员函数 声明时包含关键字static.注意以下两点: 1.使用静态成员函数时不能通过对象或者this指针来调用,只能使用类名+作用域解析符来调用. 2.静态成员函数只能使用静态成员. new操作符 在使用 #include <new> 之后,new操作符可以在分配内存时指定内存位置.例如: 1 //创建一个512字节的内存缓冲区 2 char *buffer = new char[512]; 3 ClassName *ptr1, *ptr2; 4 5 //在buffer缓冲区中创建一个类

.NET基础拾遗(1)类型语法基础和内存管理基础

一.基础类型和语法 1.1 .NET中所有类型的基类是什么? 在.NET中所有的内建类型都继承自System.Object类型.在C#中,不需要显示地定义类型继承自System.Object,编译器将自动地自动地为类型添加上这个继承申明,以下两行代码的作用完全一致: public class A { } public class A : System.Object { } 1.2 值类型和引用类型的区别? 在.NET中的类型分为值类型和引用类型,它们各有特点,其共同点是都继承自System.Ob

码海拾遗:内存四区

C/C++编写的程序在分配内存时,通常划分为四个区域: 栈区(stack):存放函数的参数值.局部变量的值等,通常由编译器自动分配和释放 堆区(heap):动态分配的内存空间,由程序员分配和释放.若程序员忘记释放,将造成内存泄漏 数据区: 常量区:存放常量 全局/静态区:存放全局变量和静态变量 代码区:存放可执行代码的区域 堆栈生长方向和内存存放方向: 栈:栈生长方向与数组元素存放方向相反 堆:堆生长方向与数组元素存放方向相同

基础拾遗类型语法基础和内存管理基础

http://www.zfs.cn/home.php?mod=space&uid=674359 http://www.zfs.cn/home.php?mod=space&uid=674360 http://www.zfs.cn/home.php?mod=space&uid=674361 http://www.zfs.cn/home.php?mod=space&uid=674363 http://www.zfs.cn/home.php?mod=space&uid=67

C++拾遗--多线程:原子操作解决线程冲突

C++拾遗--多线程:原子操作解决线程冲突 前言 在多线程中操作全局变量一般都会引起线程冲突,为了解决线程冲突,引入原子操作. 正文 1.线程冲突 #include <stdio.h> #include <stdlib.h> #include <process.h> #include <Windows.h> int g_count = 0; void count(void *p) { Sleep(100); //do some work //每个线程把g_c

Python之路【第一篇:Python基础之拾遗】

拾遗一:Python种类 1.Cpython: 由C语言实现,将.py文件编译为.pyc文件的字节码,再转换为机器码.    2.Jpython: 由JAVA语言实现,将python的代码编译为JAVA的字节码,再转换为机器码.    3.Ironpython: 由C#实现,将将python的代码编译为C#字节码,再转换为机器码. 4.pypy: 将python的代码转换为字节码的同时也转换为机器码,提高执行速度. 拾遗二:Python的编码 1.ASCII码(American Standard