java 内存分布_一图看懂JVM内存分布,永久记住!

经常在说JVM内存分布,也经常去看,但是总是在面试的时候说不清楚或者模糊,甚至有可能说错,只有真正的理解,并且在心中有一个总结构图才能记得清楚说的清楚!

| JVM总览图

java内存区域主要分程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区、直接内存。其中程序计数器、Java虚拟机栈、本地方法栈属于线程隔离,即他们都有自己的线程归属,其他属于线程共享的。

| 各分区详解

a、程序计数器

这个是当前线程正在执行的字节码行号指示器。根据这里面的内存数据来确定程序接下来执行的指令。每个线程都有一个,相互隔离,线程切换回来时才知道怎么执行。如果执行的是方法,这里记录的是虚拟机字节码指令的地址。当执行的是Native方法的时候为空(Undefined)。

因为只存储一个指令,所以它不会出现任何OutOfMemoryError。也是唯一一个!

b、Java虚拟机栈

每个线程私有,里面装的多个栈帧,每个栈帧对于的一个方法。里面存储的是Java方法的内存模型。相当于描述的是一个方法需要的内容。

如下图,每个线程都有一个虚拟机栈,每个栈中都有多个栈帧。每个栈帧代表一个方法,一个方法的执行就是栈帧的进栈与出栈。

比如一个main方法调用了Method1(),Method1()调用Method2()。当线程执行的时候,先main方法对应的栈帧压入虚拟机栈,作为栈帧1。然后调用Method1()时,Method1()对应的栈帧压入虚拟机栈,作为栈帧2。然后调用Method2()时对应的栈帧压入虚拟机栈作为栈帧3。当Method2()方法执行完成,栈帧3弹出。接着Method1()继续执行,执行完成栈帧2弹出,接着main方法继续执行,执行完成栈帧1弹出。整个方法执行完成。

每个栈帧存就是对方法的描述。其中局部变量表就是一个方法里面定义的变量,其中包括:基本数据类型(boolean、byte、char、short、int、float、long、double)和对象引用。

注:long和double会占两个局部变量空间。

异常:线程请求的栈深度大于虚拟机允许的深度,将抛出StackOverflowError异常。如果虚拟机栈可以动态扩展,当扩展的时候没有申请到内存的时候抛出OutOfMemoryError.

c、本地方法栈

线程私有,和上一个Java虚拟机栈作用相似,Java虚拟机栈是为Java方法服务,本地方法栈是为Native服务。

d、Java堆

Java虚拟机管理最大的一块,线程共享,存放对象实例和数组。分新生代(1/3)和老年代(2/3),新生代还可以分Eden(8/10)、From Survivor(1/10) 、To Survivor(1/10),是主要根据垃圾清理来分的。

异常:无法再对对象实例分配,并且堆也无法扩展时,将抛出OutOfMemoryError。

e、方法区

线程共享,主要存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码。

运行时常量池也是方法区的一部分,比如String有一个常量池,他就是放到这个里面的。

异常:当方法区无法满足内存分配时,将抛出OutOfMemoryError异常。

f、直接内存

NIO通过使用Native函数库直接分配对外内存。

异常:不受Java堆大小限制,但是受机器的物理内存限制,当各个内存区域大于机器物理内存的时候,会出现OutOfMemoryError。

| 总结

Java作为面向对象的一门语言,表面上是JVM内存分布以线程划分,实则主要也是类和对象的分布。简单的总结对比图:

Java程序员日常学习笔记,如理解有误欢迎各位交流讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Winodows10 安全登录(Administrator账户与Microsoft Account关联

我们都知道windows系统最大的管理员是administrator,linux是root,从windows7时代开始,安装操作系统的时候会在最后一步提示创建一个本地账户一直延续到windows8、windows8.1、windows10。近期微软发布了windows10后,很多用户都开始…

微信企业号三个连接模式

在银行里做微信企业号开发有半年多了,因银行封装了调用微信企业号的方法,说是微信企业号开发,其实就是jsp,java代码的编写,银行用的开发工具是EOS,对这个工具我只想说,用久了,就找不…

java opencv安装路径_Java搭建opencv开发环境

由本菜13历经4天才搭建的好的Java OpenCv开发环境带来 .PS:不保证过程都是必须的,必要的.反正我自己成功了... 嘿嘿嘿.官方网站SourceForge点击FilesFiles因为我的机器是Mac,所以选择了unix. 然后下载3.4.3版本3.4.3PS:主要是因为刚开始接触这个OpenCv的时候是用HomeBrew装的, …

iBatis——执行原理

a) 执行原理 1、 将一个对象作为 参数(对象可以是Java Bean,Map实现和基本类型的包装类),参数对象将为SQL修改语句和查询语句设定参数值。 2、 执行 mapped statement。这是SQL Maps最重要的步骤。SQL Map框架将创建一个PreparedS…

让IT工作者过度劳累的12个坏习惯

1. QQ、MSN、Gtalk,一个都不少。坏习惯 由于聊天对象与聊天内容的不可控制性,使用即时通讯软件是降低工作效率的罪魁祸首。有调查显示,使用即时通讯软件,工作效率会降低 20%. 2. “总想多看一点点”——忘记上网的目的。 本想查找…

flux java_Java反应式框架Reactor中的Mono和Flux

1. 前言最近写关于响应式编程的东西有点多,很多同学反映对Flux和Mono这两个Reactor中的概念有点懵逼。但是目前Java响应式编程中我们对这两个对象的接触又最多,诸如Spring WebFlux、RSocket、R2DBC。我开始也对这两个对象头疼,所以今天我们就…

MySQL grant 权限,分别可以作用在多个层次上

1. grant 作用在整个 MySQL 服务器上:grant select on *.* to dbalocalhost; -- dba 可以查询 MySQL 中所有数据库中的表。grant all on *.* to dbalocalhost; -- dba 可以管理 MySQL 中的所有数据库2. grant 作用在单个数据库上:grant select on testdb…

用了2年的EOS的感受

EOS是普元信息技术股份有限公司开发的产品,核心是eclipse,给eclipse穿上了很多衣服。不知道普元公司给eclipse捐款了没。 开发人员可以从它的官网免费下载,免费用。免费版的服务器最多链接数是5个人,这5个人在生产上行不通的&…

java 线程分组_Java多线程可以分组,还能这样玩!

前面的文章,栈长和大家分享过多线程创建的3种方式《实现 Java 多线程的 3 种方式》。但如果线程很多的情况下,你知道如何对它们进行分组吗?和 Dubbo 的服务分组一样,Java 可以对相同性质的线程进行分组。来看下线程类 Thread 的所…

关于Android构建

“IDE都是给小白程序员的,大牛级别的程序员一定是命令行控,终端控,你看大牛都是使用vim,emacs 就一切搞定” 这话说的虽然有些绝对,但是也不无道理,做开发这行要想效率高,自动化还真是缺少不了命令行工具&a…

普元EOS开发学习(二)

1、QueryFormQueryForm控件是一个用来输入查询条件的表单&#xff0c;作为一个代码片断&#xff0c;以<h:form></h:form>形式嵌入在JSP页面中。表单提交时&#xff0c;根据控件生成时设置的逻辑&#xff0c;可以对指定数据集进行有条件查询&#xff0c;同时可以根据…

java map class_Java:声明一个包含两个相关泛型类型的Map(Map,Class ?extends ClassB )...

另一种方法是提供自己的Map实现.如果扩展现有实现并使用新类型,则不需要太多代码&#xff1a;public class CompatibleHashMap extends HashMap, ClassB> {}现在,一个CompatibleHashMap< String>只允许你把ClassA< String>作为键和ClassB< String>作为价值…

centos 6 安装zabbix 3.0

1.安装PHP Zabbix 3.0对PHP的要求最低为5.4&#xff0c;而CentOS6默认为5.3.3&#xff0c;完全不满足要求&#xff0c;故需要利用第三方源&#xff0c;将PHP升级到5.4以上&#xff0c;注意&#xff0c;不支持PHP7 rpm -ivh http://repo.webtatic.com/yum/el6/latest.rpm yum in…

普元EOS开发学习(一)

警惕EOS的拖图元开发导致技术退步&#xff0c;请阅博主《用了2年EOS后的感受》 --------------- EOS开发和原有的JAVA开发有很大的不同&#xff0c;在开发的过程中&#xff0c;只能看到JSP页面的源代码&#xff0c;如果想要了解到操作类型的代码&#xff0c;那么你只能看到XML…

java 共享锁 独占锁_java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁...

一、公平锁与非公平锁1.1 概述公平锁&#xff1a;是指多个线程按照申请锁的顺序来获取锁。非公平锁&#xff1a;是指在多线程获取锁的顺序并不是按照申请锁的顺序&#xff0c;有可能后申请的线程比先申请的线程优先获取到锁&#xff0c;在高并发的情况下&#xff0c;有可能造成…

GoogleNet网络分析与demo实例

参考自 up主的b站链接&#xff1a;霹雳吧啦Wz的个人空间-霹雳吧啦Wz个人主页-哔哩哔哩视频这位大佬的博客 Fun_机器学习,pytorch图像分类,工具箱-CSDN博客 1. GoogLeNet网络详解 GoogLeNet在2014年由Google团队提出&#xff08;与VGG网络同年&#xff0c;注意GoogLeNet中的L大…

解决win10安卓虚拟机每十几分钟蓝屏重启问题

2012年第一次接触android&#xff0c;它的虚拟机是很慢的&#xff0c;如今Intel HAXM 技术为 Android 模拟器加速&#xff0c; 使模拟器运行度媲美真机&#xff0c; 彻底解决模拟器运行慢的问题。问题也是由它而来&#xff0c;因为驱动和系统不兼容造成的。 CPU必须I3及I3以上才…

pg_resetxlog清理的pg_xlog下的WAL日志

PostgreSQL的pg_xlog下有大量日志&#xff0c;空间不足&#xff0c;如何删除&#xff1f; Darren1:postgres:/usr/local/pgsql/data/pg_xlog:>ls 000000010000000000000008.00000028.backup 00000001000000000000009D 0000000100000000000000C9 0000000100000000000000F5…

mysql备份:一,Xtrabackup

资料来自于马哥 注明&#xff1a;此工具不能备份出sql语句。另外只能适用innodb存储引擎。 一、安装 1、简介 Xtrabackup是由percona提供的mysql数据库备份工具&#xff0c;据官方介绍&#xff0c;这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具。特点&…

51服务的开启方式

服务开启方式的知识点见博文&#xff1a;http://blog.csdn.net/zengmingen/article/details/49425161步骤&#xff1a; 1、新建Android项目名“51服务的开启方式” 2、新建一个类 MyService&#xff0c;继承 Service 3、在清单文件里配置第二步建的service 4、在Myservice类中覆…