JVM内存管理简单剖析
Java是一个跨平台语言,屏蔽操作系统的差异,无需关心复杂内存管理,做到编写一次到处运行。其强大的能力源于Java Virtual Machine (虚拟机)默默的付出。代码运行在虚拟机之上,虚拟机运行在操作系统之上,虚拟机的实例就是操作系统上的一个进程。那么进程之下便是线程,线程是运行业务逻辑的核心。
从上Java虚拟机的职责上来看至少实现两大功能:
1、能够正确运行Java编写的代码
2、提供内存管理机制(垃圾回收机制)
Java Virtual Machine 有一个严格的规范,不同的厂商可以按照规范自己实现,这里针对的是HotSpot。
既然线程是核心,先从线程运行所需的资源角度剖析Java虚拟机运行时区域的划分:共享和私有的逻辑分区。
共享区域:方法区和堆,为所有线程提供基础和公共的信息
方法区:用于存储类的元数据信息、常量池、静态变量等
堆:存放对象实例和数组的区域
私有区域:虚拟机栈(本地方法栈)和程序计数器,程序运行私有的
虚拟机栈:Java(native)方法运行时动态内存模型,栈帧作为数据结构存储运行时需要需要的数据,对象引用方式是采用直接引用堆上的对象和方法区的对象类型信息,每个线程都有自己的栈
程序计数器:它是代码运行的指示器,如果运行的是Java方法它的值是下一个指令的地址,为了能够线程切换准确执行指令,因此每个线程需要配置一个程序计数器
从内存自动管理角度,需要从有利于垃圾回收的角度来剖析内存逻辑区域划分,堆是虚拟机管理的最大内存区域同时也是对象实例存储区域(JIT除外)。关注的重点就是堆空间的逻辑划分:Eden区,From Survivor区,To Survivor区,Old区。当对象申请分配空间时发现空间不足情况下就会采用可达性分析法在Eden进行垃圾对象判断,能够存活的移入Survivor区,最终进入老年区。犹如生物进化,适者生存。此时的堆内存逻辑区域可以更加细化。
综合上述两点就清晰描绘虚拟机为何要划分逻辑区域(内存区域划分设计目的)。
最新文章
- 如何解决ajax重复提交的问题
- 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX
- js 获取json串中的值
- plain framework 1 参考手册 入门指引之 模块
- hadoop安装计
- nodeschool.io 6
- N-Queens II 解答
- Java面向对象面试案例
- 升级到iis7 的web.config配置
- anglehack参赛总结
- ASP.NET MVC扩展点
- 经验分享:极速化 CocoaPods
- PHP 5 String 函数
- hdu3709 数位dp
- Serilog记录MongoDB日志报错:requires the binary sub type to be UuidLegacy, not UuidStandard
- git 入门教程之备忘录[译]
- php分词工具scws
- Flask中的模板语言jinja2
- Ik分词器没有使用---------elasticsearch-analysis-ik 5.6.3分词问题
- Oracle EBS AP 应付核销到确定一行预付款