JVM学习之路笔记

JVM 的内存区域 运行时数据区域
就是上面的图,先说 共享区,就是可以被所有线程访问的
(1)方法区:存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
在jdk1.7以前被称为永久代,1.8以后被称为元空间
JVM 在执行某个类的时候,必须先加载,class文件中除了方法接口类信息外还有一个常量池,它里面有字面量和符合引用
字面量就是 字符串( String a=“b” )、基本类型的常量( final 修饰的变量)
符合引用 就是假如一个类比如说是Test类吧,它引用了一个Util工具类,但是在编译的时候Test并不知道这个工具类的实际内存地址,只能用符号代替。在编译的时候用符号引用,在加载的时候符号引用就变成了直接引用了,也就是引用了实际的内存地址。
常量池与运行时常量池
类中的一个字符串常量存放在 class 文件常量池中的,当JVM加载解析的时候会把这个字符串常量放到运行时常量池里面去,并在解析的时候,指向这个常量的索引值
(2)堆:主要存放对象和数组(比如我们在写程序的时候new出的对象就在堆里存放)
堆大小参数:
-Xms :堆的最小值;
-Xmx :堆的最大值;
-Xmn :新生代的大小;
-XX:NewSize ;新生代最小值;
-XX:MaxNewSize :新生代最大值;
 
私有区
程序计数器:就是当前线程记录字节码指令的行号地址的指示器,因为线程可能被阻塞,挂起,当唤醒的时候程序计数器会记录他的行号接着运行。 JVM 中唯一不会 OOM(OutOfMemory) 的内存区域
 
本地方法栈:用于管理本地方法的调用,比如说str.hashCode()方法,这个hashCode()方法就是用本地方法栈存储的,点这个方法可以看到源码里用native修饰的,他就是服务这类修饰的方法。
 
虚拟机栈
栈的数据结构:它遵循先进后出的原则,就是先调用的方法最后出栈,后调用的方法先出栈。意思就是在A方法里调用B方法,必须等到B方法跑完了再接着运行A方法下面的语句。
虚拟机栈的作用:在JVM运行过程中存储当前线程运行的方法所需的数据,指令和返回地址。
虚拟机栈是基于线程的 :他的生命周期和线程一样,随着线程的出生而出生,线程跑完了它也就消失了
一个虚拟机栈的默认大小是1M,可以通过–Xss 调整大小,例如 -Xss256k
 
虚拟机栈其实都是在栈帧上操作数据的,那么什么是栈帧呢?
 
栈帧  类中每一个方法就是一个栈帧,
在每个 Java 方法被调用的时候,都会创建一个栈帧,并入栈。一旦方法完成相应的调用,则出栈。
栈帧大体都包含四个区域 ( 局部变量表、操作数栈、动态连接、返回地址 )
 
局部变量表
顾名思义就是局部变量,int a=1,的a,object b=new object()的b就在局部变量表里存放。
操作数栈
就是一些数据的运算都在这里存放并操作。int a=1;b=2; int c=a+b;运算的时候会把a和b放到操作数栈里,然后交给cpu执行后返回3再回到操作数栈,并且在局部变量表里用c指向这个3,最后把3同步出去。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值