JVM学习记录1--JVM内存布局
先上个图

这是根据《Java虚拟机规范(第二版)》所画的jvm内存模型。
程序计数器:程序计数器是用来记录当前线程方法执行顺序的,对应的就是我们编程中一行行代码的执行顺序,如分支,跳转,循环,异常处理等。所以在多线程下,程序计数器必然是线程隔离的,每个线程都有自己独立的程序计数器。注意,Java虚拟机中的程序计数器指向正在执行的字节码地址。
本地方法栈:本地方法栈时用来保存本地方法,即jvm调用外部的方法,比如操作系统本身的方法,或者自定义的c方法,这类方法都带有native关键字。这类又被成为java native interface。
虚拟机栈:也就是我们常说的栈,虚拟机栈时线程私有的,当虚拟机执行到一个方法时,就会在当前线程所在的栈中创建一个栈帧,栈帧用于存储局部变量、操作栈、动态链接、方法出口等信息。因此我们在方法中定义的一些基本变量,和引用变量都会存在栈中。
堆:堆是jvm内存区域最大的区域,堆被所有线程共享,几乎所有的实例对象都保存在堆中,所以堆也是垃圾收集器管理的主要区域,细分下堆还分为 eden区域,from survivor区域,to survivor区域。这个比较复杂,之后在详细说明。
方法区:又称 永久代,和堆类似,用于存放对象实例、以及class类信息、常量、静态变量、以及及时编译后的代码信息。这个区域也是所有线程共享的,也会有垃圾回收。实际上方法区只是一种概念,方法区本身也是堆的一部分,换句话说,方法区是在堆里面的,这也是人们常把jvm简单分为堆和栈的原因。但是在java8中,已经把永久代改为了元数据区(metaspace),元数据区使用的是本地内存(操作系统的内存),主要存储的类的元数据(class信息,代码信息等)。而常量,静态变量依然存在堆中。如下图

常量池:常量池是方法区的一部分,储存着常用,比如加了final关键字,或者字符串。占用的是堆中的一部分。因此以下代码也会报OOM
int i=0;
while(true){
new String(i++).intern();
}
本文借鉴
深入理解Java虚拟机-----周志明著
终于总结好了---
JVM学习记录1--JVM内存布局的更多相关文章
- java之jvm学习笔记十三(jvm基本结构)
java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成 ...
- JVM学习一:JVM之类加载器概况
18年转眼就3月份都快结束了,也就是说一个季度就结束了:而我也因为年前笔记本坏了,今天刚修好了,那么也应该继续学习和博客之旅了.今年的博客之旅,从JVM开始学起,下面我们就言归正传,进入正题. 一.J ...
- jvm学习记录-对象的创建、对象的内存布局、对象的访问定位
简述 今天继续写<深入理解java虚拟机>的对象创建的理解.这次和上次隔的时间有些长,是因为有些东西确实不好理解,就查阅各种资料,然后弄明白了才来做记录. (此文中所阐述的内容都是以Hot ...
- JVM学习记录-线程安全与锁优化(二)
前言 高效并发是程序员们写代码时一直所追求的,HotSpot虚拟机开发团队也为此付出了很多努力,为了在线程之间更高效地共享数据,以及解决竞争问题,HotSpot开发团队做出了各种锁的优化技术常见的有: ...
- JVM学习笔记一:内存管理
参考资料 本文参考:<深入理解Java虚拟机>作者 周志明 知识产权归作者所有 走近java java组成部分:java语言.各平台虚拟机.Class文件结构.java api 类库.第三 ...
- 【转载】JVM 学习——垃圾收集器与内存分配策略
本文主要是对<深入理解java虚拟机 第二版>第三章部分做的总结,文章中大部分内容都来自这章内容,也是博客 JVM 学习的第二部分. 简述 说到垃圾收集(Garbage Collectio ...
- JVM学习记录-类加载的过程
类的整个生命周期的7个阶段是:加载(Loading).验证(Verification).准备(Preparation).解析(Resolution).初始化(Initialization).使用(Us ...
- JVM学习记录-垃圾回收算法
简述 因为各个平台的虚拟机的垃圾收集器的实现各有不同,所以只介绍几个常见的垃圾收集算法. JVM中常见的垃圾收集算法有以下四种: 标记-清除算法(Mark-Sweep). 复制算法(Copying). ...
- JVM总结-java对象的内存布局
在 Java 程序中,我们拥有多种新建对象的方式.除了最为常见的 new 语句之外,我们还可以通过反射机制.Object.clone 方法.反序列化以及 Unsafe.allocateInstance ...
- JVM学习九:JVM之GC算法和种类
我们前面说到了JVM的常用的配置参数,其中就涉及了GC相关的知识,趁热打铁,我们今天就学习下GC的算法有哪些,种类又有哪些,让我们进一步的认识GC这个神奇的东西,帮助我们解决了C 一直挺头疼的内存回收 ...
随机推荐
- 品Spring:SpringBoot轻松取胜bean定义注册的“第一阶段”
上一篇文章强调了bean定义注册占Spring应用的半壁江山.而且详细介绍了两个重量级的注册bean定义的类. 今天就以SpringBoot为例,来看看整个SpringBoot应用的bean定义是如何 ...
- ZK 网络故障应对法
网络故障可以说是分布式系统天生的宿敌.如果永远不发生网络故障,我们实际上可以设计出高可用强一致的分布式系统.可惜的是不发生网络故障的分布式环境还不存在,ZK 使用过程中也需要小心的应付网络故障. 让我 ...
- 阿里云服务器ecs配置之安装tomcat
1.下载链接:https://tomcat.apache.org/download-70.cgi,选择需要的版本下载(.tar.gz文件后缀) 2.通过Xshell.Xftp上传至CentosX的 某 ...
- Python邮件发送功能
import smtplibfrom email.mime.text import MIMEText_user = "1147016115@qq.com"#发件人_pwd = &q ...
- Bootstrap入门学习笔记(只记录了效果)
基本头文件 <!DOCTYPE html> <html> <head> <title>Bootstrap 实例</title> <me ...
- Linux下几种常见压缩方式测试对比
目录 Linux下几种常见压缩方式测试对比 参考 简介 测试 总结 Linux下几种常见压缩方式测试对比
- Javascript中Promise的简单使用
// 函数功能:1秒以后创建一个10以内的随机整数,并判断这个数是否为偶数:如果是偶数则做一件事情,如果是奇数则做另一件事情 function doSomthing() { var promise = ...
- Linux下beego及beego相关插件安装
Linux下beego及beego相关插件安装 1.下载及配置go环境看见链接: http://golang.org/dl/ 网盘:链接: https://pan.baidu.com/s/1MveUM ...
- python常用算法学习(3)
1,什么是算法的时间和空间复杂度 算法(Algorithm)是指用来操作数据,解决程序问题的一组方法,对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但是在过程中消耗的资源和时间却会有很大 ...
- 02-28 scikit-learn库之线朴素贝叶斯
目录 scikit-learn库之朴素贝叶斯 一.MultinomialNB 1.1 使用场景 1.2 代码 1.3 参数详解 1.4 属性 1.5 方法 二.GaussianNB 三.Bernoul ...