博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java转行之路—《深入理解JAVA虚拟机总结》(一)
阅读量:7296 次
发布时间:2019-06-30

本文共 1133 字,大约阅读时间需要 3 分钟。

Java转行之路—《深入理解JAVA虚拟机总结》(一)

Java虚拟机运行时数据区

程序计数器(Program Counter Register)

(1)Little Space

(2)当前所执行字节码的行号指示器
(3)每条线程都有独立的程序计数器——线程切换后回到正确的位置
ps.多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的

虚拟机栈(Virtual Machine Stacks)

(1) 线程私有,生命周期与线程相同

(2) 原理图
(3) 线程请求栈的深度大于虚拟机所允许的深度,抛出StackOverflowError;

虚拟机栈动态扩展时无法申请到足够的内存,抛出OutOfMemoryError。

1

本地方法栈(Native Method Stack)

本地方法栈与虚拟机栈作用相似,区别:虚拟机栈为虚拟机执行Java

方法服务,本地方法栈则为Native方法服务。

Java堆(Heap)

(1)最大的一块内存;

(2)被所有线程共享,在虚拟机启动时创建;
(3)唯一目的:存放对象实例;
(4)垃圾收集器管理的主要区域,因此也被称为GC堆。由于GC回收机制采用分代收集算法,所以堆还可以分为新生代和老年代; 从内存分配角度看,堆可划分出多个线程私有的分配缓冲区。
(5)不需要连续的内存,可以选择固定大小也可以通过-Xmx和-Xms控制虚拟机扩展,堆无法再扩展时,抛出OutOfMemoryError。

方法区

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

不需要连续的内存,可以选择固定大小也可以通过-Xmx和-Xms控制虚拟机扩展,可以选择不实现垃圾收集。这区域的内存回收目标主要是针对常量池的回收和对象类型的卸载。

运行时常量池

(1)Runtime Constant Pool是方法区的一部分。

  • Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,发生于类加载后进入方法区的运行时。
  • 运行时常量池vsClass文件常量池:虚拟机规范对于运行时常量池无任何细节要求,除了保存Class文件中描述的符号引用外,还会把翻译出来的直接引用也储存在运行时常量池中;运行时常量池具备动态性,String.intern()方法可以将运行时新的常量放入池中。

直接内存

不是虚拟机运行时数据取的一部分,但这部分内存也被频繁使用,也可能导致OutOfMemoryError。

NIO(基于通道与缓冲区的I/O方式)可以使用Native函数库直接分配堆外内存,然后通过堆中DirectByteBuffer对象作为这块内存的引用进行操作。

转载地址:http://yownm.baihongyu.com/

你可能感兴趣的文章
Python-函数
查看>>
全排列
查看>>
android音乐播放器(2)
查看>>
iOS presentedViewController的基本使用
查看>>
LNMP整合安装Redmine2.3实录
查看>>
易宝典文章——怎样管理Exchange Server 2013安全组
查看>>
erlang 简单例子的编译运行
查看>>
HyperV 中Windows Server 2012 非共享存储的在线迁移
查看>>
安装 CentOS 7 后必做的七件事
查看>>
myeclipse安装pydev
查看>>
【桌面虚拟化】之五PCoIP
查看>>
linux 监控CPU memory disk process 脚本
查看>>
Nginx启动脚本/etc/init.d/nginx
查看>>
Visual Studio 2017 离线安装方式
查看>>
枚举出局域网上所有网络资源
查看>>
Android深入浅出之Binder机制
查看>>
动态磁盘的管理
查看>>
zookeeper 集群安装(单点与分布式成功安装)
查看>>
python中list,dirt方法说明
查看>>
lamp环境一键部署(yum)
查看>>