程序计数器:

程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。

程序计数器处于线程独占区

如果线程执行的是Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址,如果正在执行的native方法,这个计数器的值为undefined

此区域是唯一一个Java虚拟机规范中没有规定任何OutOfMenmoryError(内存溢出)情况的区域。

Java虚拟机栈

虚拟机栈描述的是Java方法执行的动态内存模型

栈帧:每个方法执行,都会创建一个栈帧,伴随这方法从创建到执行完成。用于存储局部变量表,操作数栈,动态链接,方法出口等。

局部变量表:(1).存放编译期可知的公众基本数据类型,引用类型,returnAddress类型。       (2).局部变量表的内存空间在编译期完成分配,当进入一个方法时,这个方法需要在帧分配多少内存是固定的,在方法运行期间是不会改变局部变量表的大小

大小:当栈帧的内存大于Java虚拟机栈的内存时,会报StackOverflowError或OutOfMemoryError内存溢出问题

【示例1-1】:

public static void test(){

test();

}

public static void main(String[] args) {

AssetPreservationServer.test();

}

Java虚拟机栈内存溢出:

Java方法执行动态内存模型图:

本地方法栈:与Java虚拟机栈的运行都是一致的,唯一的区别是:Java虚拟机栈为虚拟机执行Java方法服务,而本地方法栈为虚拟机执行native方法服务。

Java堆:是虚拟机中管理内存最大的一块区域。也是垃圾收集器主要的管理区域,主要存放对象实例等等。

方法区:

存储虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。

类信息包含:类的版本,字段,接口,方法等等。

运行时常量池:

常量池是属于方法区

代码【实例1-2】

public static void main(String[] args) {

String s1 = "abc";

String s2 = "abc";

String s3 = new String("abc");

System.out.println(s1 == s2);//true

System.out.println(s1 == s3);//false

System.out.println(s1 == s3.intern());//true

}

运行是常量池运行模型【示例1-3】

解读:

1.Java中创建两个变量s1,s2

String s1 = "abc";

String s2 = "abc";

2.程序执行到s1,s2时,Java虚拟机中栈内存开辟一块局部变量,而这块局部变量中存放了s1和s2两个变量

3.堆内存中就创建“abc”,“abc”两个实例,s1指向一个abc实例,s2指向另外一个“abc”实例

4.我们创建的每一个字符串的都会放到常量池里,所以方法区中就创建了一块常量池,在常量池中,我们可以想象有一张StringTable表,而它数据类型为一个HashSet集合,用来存放我们所实例化的对象,s1创建一个“abc”,就会放到HashSet中,创建一个就存放一个,而HashSet的特性是无序不可重复的,所以s1和s2创建的“abc”最后只存放了一个“abc”,所以s1和s2的对应地址显然是相同的(s1==s2的值是相等的)

5.再创建一个实例s3

String s3 = new String("abc");

6.第5步创建的实例是我们手动直接创建,我们通过new创建出来的对象是直接放在堆内存里,所以就不用去考虑常量池的问题了。就直接在堆内存中开辟一块空间,将值直接赋给了s3,所以s3==s1或s2时,值是false的

7.当我们在s3加intern()方法时,s1==s3.intern()的值为true,因为intern()这个方法会把我们创建的“abc”区域,搬到运行时常量池里面去,产生一个运行时常量,所以s1==s3.intern()的值是true。

java 虚拟机内存管理_java虚拟机内存管理相关推荐

  1. JAVA虚拟机 安全区域_Java虚拟机的内存区域

    2020年12月10日 阅读 186 关注 Java虚拟机的内存区域 最近在看<深入理解Java虚拟机>,故此写下自己的学习笔记. JVM 运行时数据区域 Java 虚拟机在执行 Java ...

  2. java虚拟机内存监控_java虚拟机内存监控工具jps,jinfo,Jstack,jstat,jmap,jhat使用...

    将会打印出很多jvm运行时参数信息,由于比较长这里不再打印出来,可以自己试试,内容一目了然 Jstack(Stack Trace for Java):JVM堆栈跟踪工具 jstack用于打印出给定的j ...

  3. java虚拟机内存告警_Java虚拟机总结

    JVM体系四大块: 类的加载 JVM内存结构 GC算法 垃圾回收 GC分析 性能调优 执行引擎 JVM架构图 jvm.arch 一.类的加载机制 类的加载 类的加载,将class文件读入方法区,然后在 ...

  4. java ppt转图片 内存溢出_Java虚拟机内存及内存溢出异常

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进来,墙里面的人却想出来. 不知道其他人想出来没,反正我是没想出来,为什么这个JVM的运行时内存要这样设计?. 以下内容 ...

  5. java虚拟机内存告警_java虚拟机内存溢出各种场景总结

    java堆溢出 java堆用于存储对象实例,只要不断地创建对象,并且保证gc roots到对象之间有可达路径来避免垃圾回收机制来清楚这些对象,那么在 对象到达最大堆的容量限制后就会产生内存溢出溢出. ...

  6. java 虚拟机内存类_java 虚拟机类加载 及内存结构

    在面试java工程师的时候,这道题经常被问到,故需特别注意. 1.JVM 简介 JVM 是我们Javaer 的最基本功底了,刚开始学Java 的时候,一般都是从"Hello World &q ...

  7. c++堆内存默认大小_Java 自动内存管理

    Java 与 C.C++ 最大的区别在于内存管理方面. 对于 C.C++来说, 在内存管理方面,既拥有每个对象的"所有权",又担负着每个对象生命从开始到终结的维护责任. 而对 Ja ...

  8. java 虚拟机的原理_java虚拟机的原理

    所谓虚拟机,就是一台虚拟的机器.它是一款软件,用来执行一系列虚拟计算机指令,大体上虚拟机可以分为系统虚拟机和程序虚拟机,Visual Box .Vmare就属于系统虚拟机.他们完全是对物理计算机的仿真 ...

  9. linux java main 参数设置_Java虚拟机参数设置

    "MyEclipse has detected that less than 5% of the 64MB of Perm Gen (Non-heap memory) space remai ...

  10. java虚拟机 函数表_java虚拟机的基本结构如图

    1 java虚拟机的基本结构如图: 1)类加载子系统负责从文件系统或者网络中加载Class信息,加载的类信息存放于一块称为方法区的内存空间.除了类的信息外,方法区中可能还会存放运行时常量池信息,包括字 ...

最新文章

  1. Wrong permissions on configuration file, should not be world writable!
  2. linux下使用rpm安装libxml2,gcc,gcc-c++等基本包
  3. lua学习笔记之位及字节
  4. 1044 拦截导弹——http://codevs.cn/problem/1044/
  5. IQueryable 和 IEnumerable
  6. 模板 - 数据结构 - ST表 + 二维ST表
  7. 《仙剑奇侠传online》游戏后台优化分析:CPU、内存与启动时间
  8. false例句_false是什么意思_false的翻译_音标_读音_用法_例句_爱词霸在线词典
  9. Spring框架的事务管理的基本概念
  10. 最右显示请求服务器不存在,修改合流任务_实时音视频 RTC_服务端API参考_合流任务管理_华为云...
  11. Spring Cloud —— RocketMQ 的消息类型
  12. codeigniter mysql 存储过程_Codeigniter框架使用Mysql存储过程的例子
  13. Google Adsense的技巧、诀窍和秘密
  14. 国外网站整理出十大必须拥有的虚拟化工具
  15. 子龙山人:我从Cocos2d-x团队里学到的
  16. 用Python算出你的名字,比老僧算的更快!
  17. c语言数组文曲星猜数游戏编程,关于文曲星上猜数字游戏的c编程方法
  18. MSP432E4系列编码器(QEI模块)速度换算
  19. Linux如何卸载软件
  20. UltraEdit的注册码,版本:15.10.0.1026

热门文章

  1. 【转发活动】Hey, 是你吗? | 寻粉启示
  2. 【React Native开发】React Native控件之DrawerLayoutAndroid抽屉导航切换组件解说(13)
  3. 在VC8里调用VBScript.dll的RegularExpression
  4. FreeRTOS任务挂起与解除
  5. 快领!了不起的程序员专属红包封面!!
  6. 为什么 Linux 默认页大小是 4KB
  7. 【spring】通过GZIP压缩提高网络传输效率(可以实现任何资源的gzip压缩、包括AJAX)
  8. 为什么谷歌要执行严格的代码编写规范
  9. Linux环境编程导引
  10. JavaScript六种继承方式的递进推演