JVM垃圾回收与内存分配浅析(一)
来源:互联网 发布:agv磁导航算法 编辑:程序博客网 时间:2024/05/17 23:58
——读《深入理解Java虚拟机JVM高级特性与最佳实践》自我整理
熟悉Java的人都知道Java的一个特点:一次编译,到处运行。但是为什么只能Java实现这个特性,而比Java执行效率更高的c、c++没有这个特性呢?首先到处运行指的是不同的操作系统 windows linux unix 等等,c/c++在不同的系统下或者不同的编译器下,其编译的规则是有些不同的,这样做是为了更大限度地提升它的执行效率,所以不得不在兼容性方面做了妥协,而Java不一样,它在不同的操作系统上面又封装了一个相当于是自己的操作系统,这就是Java虚拟机(JVM),只要每个操作系统上装上这个JVM就都可以运行基于这之上的Java程序了。
说起Java与c的不同,可能大家第一反应是Java是个面向对象的语言,第二反应就是Java拥有自动内存管理机制。那么Java的内存管理机制到底是怎样的?首先从字面上看自动内存管理,肯定管理的是内存的从分配、使用、回收、再使用的一个整个的闭环流。
在了解内存管理之前,我们首先要对JVM运行时的数据区的结构有所了解,看下图:
线程共享区代表着里面的数据区随着线程的生命周期从生到死,非线程共享区是在JVM启动时创建,关闭时销毁的。
程序计数器:它表示的当前线程执行的字节码的行号,因为在多线程环境中,操作系统对多线程采用的是轮流切换并且分配处理时间的机制,为了要保证每个线程在切换至其它线程时其执行进度不丢失,所以每个线程中都会有这么一个计数器。
虚拟机栈:它描述的是Java方法执行的内存模型,每次执行方法时会产生一个栈帧,包含局部变量栈、操作数栈、方法出口等,方法的执行从开始到结束就是这个栈帧入栈出栈的过程。
本地方法区:和虚拟机栈类似,不过它处理的是 Native方法的内存模型。
堆:内存回收中的主要回收区域,也是JVM管理的内存中的最大一块,里面存放的都是对象的实例。
方法区:这里面储存的都是一些类的相关信息、静态变量、常量、编译过后的代码等,主要是对堆的一个描述逻辑的区域。
这几个区域的联系就像下图一样:
例如在一个方法中有一个对象:Object obj=new Object(); 那么在这个方法中的Object obj 指向了一个堆中的实例obj(通过new Object()在堆中创建),同时在堆中的这块内存中还储存了一个指向方法区中这个对象相关信息的一个指针。
- JVM垃圾回收与内存分配浅析(一)
- JVM垃圾回收与内存分配浅析(二)
- JVM垃圾回收与内存分配(一)
- JVM的垃圾回收与内存分配
- jvm 内存分配与垃圾回收
- JVM内存分配、垃圾回收、类加载浅析
- JVM垃圾回收与内存分配(二)
- JVM的垃圾回收与内存分配<转>
- 【JVM】垃圾回收算法与内存分配策略
- 垃圾回收与内存分配
- JVM内存分配、垃圾回收、启动参数
- JVM内存分配、垃圾回收、启动参数
- JVM垃圾回收及内存分配策略
- JVM垃圾回收和内存分配策略
- JVM内存分配和垃圾回收策略
- jvm内存分配及垃圾回收
- jvm学习-内存分配及垃圾回收
- JVM内存分配与回收
- iOS安装应用
- 在QML中管理动态对象
- C# Dispose与Close
- LINUX配置基于PPTP协议的VPN服务器
- iovec结构体定义及使用
- JVM垃圾回收与内存分配浅析(一)
- bash快捷建-光标移到行首、行尾等
- js操作frameset遇到的问题
- 云计算的理解
- oracle 字符集 AL32UTF8、UTF8
- 架构设计成就EDW
- Eclipse远程debug
- 你不得不知道的Visual Studio 2012(1)- 每日必用功能
- 图论算法小结