看了很多jvm写的文章,网上都是一转再转,讲的也不细,对于实际出现的问题用他们的原理来讲很难讲通,今天我特地自己理了一下,帮助别人的同时也提高自己,希望有不组的地方多指点
jvm研究
为什么要研究:首先研究这个可以让我们更加清楚jvm的工作原理,和解决实际生产中堆溢出和栈溢出的原因,同时对为什么会产生同步问题也有了更进一步的思考
首先jvm会有一个classload机制加载你所有的类和一些本地方法等,这个我就不再重复讲,主要讲下面一块
jvm对数据的存储
jvm对数据存储分5大块:
1.堆
2.栈
3.方法区(方法区(主要2个):常量池,静态成员区)
4.本地方法栈
5.程序计数器
首先,除了栈不是线程共享之外,其他都是线程共享
堆中存放的数据:数组和任何new 的对象(连带着对象的成员变量是属于每个对象的,所以也是放在堆中。例子:单例模式中,对一个成员变量操作会有同步问题。备注:servlet的机制)。 方法中new的对象一样存放在堆中,所以当你在一个方法中new很多对象,一样会出现堆溢出。
栈中存放的东西:(这里主要讲一个线程的流程)准确来说栈是给线程执行的一个通道,每个线程在启动进入栈时,jvm都会赋予一个栈帧给这个线程,栈帧中存放(中间结果集,方法中变量,对象的引用等。因为每个线程都有一个栈帧,所以方法内部变量都是线程安全的。所说的栈是线程安全的也是这个原因。所以很多文章说基本类型int是放在栈中,但是我觉得这个不太准确),在赋予栈帧的之后,jvm会从栈中给这个线程分配栈空间,假设线程使用a,b,c方法,那么线程就会把方法区中的方法放入栈中,然后通过栈帧来进行结果集的计算。所以当你的递归方法很多不能及时释放栈空间,就会有栈溢出。
本地方法:(static和final 修饰符的存放地方)
常量池:存放final的常量
静态成员区:存放类的成员变量(由于方法区是多线程共享,所以静态成员变量是具有同步问题的)
其他:存放方法的信息,比如方法名,方法返回值等等
程序计数器,本地方发栈,一个是线程的执行过程,一个是jvm自身的方法存放位置
分享到:
相关推荐
整理作为一名架构师所需的知识谱系(仅代表个人理解,学无止境啊~~),形成一棵知识树,方便记忆,同时查漏补缺。 [TOC] 索引 Java Core / J.U.C JVM IO : 各种IO模型比较的思维导图 : Netty 学习思维导图,包括...
全手写急速理解Netty模型及IO模型应用实战 Netty之IO模型开发本质手写部分实现推导篇 全手写基于Netty的RPC框架自定义协议,连接池 全手写基于Netty的RPC框架 协议编解码问题 粘包拆包与内核关系 ... Elasticsearch ...
Java的知识点其实非常多,并且有些知识点比较难以理解,有时候我们自以为理解了某些内容,其实可能只是停留在表面上,没有理解其底层实现原理。 纸上得来终觉浅,绝知此事要躬行。笔者之前对每部分的内容 对做了比较...
本github中写的都是笔记记录,其中内容大部分来源于网上优秀博文或者经典书籍,因此不推荐阅读我的笔记,只是我个人使用为主 但我的心得体会将写在CSDN中,见:,推荐你来阅读 同时,我会通过ISSUE方式,为笔记本打...
│ 高并发编程第一阶段09讲、多线程与JVM内存结构的关系,虚拟机栈实验.mp4 │ 高并发编程第一阶段10讲、Thread构造函数StackSize详细讲解.mp4 │ 高并发编程第一阶段11讲、Thread构造函数StackSize详细讲解-续....
@Retention(RetentionPolicy.RUNTIME) //在运行是加载Annotation到JVM中 public @interface MyAnnotation { public String value() default "yellow"; public int[] array() default {1,2}; public Meta...
著名的 EJB 领域顶尖的专家 Richard Monson-Haefel 在其个人网站:www.EJBNow.com 中极力推荐的 GoF 的《设计模式》,原文 如下: Design Patterns Most developers claim to experience an epiphany reading this ...
本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取...
本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取...