![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
刮瓜蛙
这个作者很懒,什么都没留下…
展开
-
对象的存活与死亡(引用计数算法和可达性分析算法以及回收方法区)
在堆中存放着Java世界中几乎所有的对象实例,垃圾收集器在堆进行回收钱,第一件事情就是要确定这些对象之中哪些对象还"存活",哪些已经"死去"(这里的死去即不可能再被任何途径使用的对象)而判断对象是否存活或者死亡,当前主流有两种算法实现引用计数算法可达性分析算法1.引用计数算法引用计数算法大致思路及特征:在对象中添加一个引用计数器,每当一个地方引用到它时,计数器就加一,当引用失效时,计数器就减一,任何时刻计数器为零的对象就是不可能再被使用的,也就说明这个对象已经死了。实现引用计数算法需要占用原创 2020-09-26 19:11:59 · 264 阅读 · 1 评论 -
垃圾收集器与内存分配策略
垃圾收集(简称GC)在java内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈这三个区域随着线程而生,随线程而灭,栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。每一个栈帧中分配多少内存基本在类结构确定下来是酒已知的因此这几个区域的内存分配和回收都具备确定性,在这几个区域内不需要过多的考虑如何回收的问题,当方法结束或者线程结束时,内存自然就跟随者回收了而Java堆和方法区这两个区域则由很显著的不确定性:一个接口的多个实现类需要处理的内存可能会不一样一个方法所原创 2020-09-26 16:27:52 · 221 阅读 · 1 评论 -
《深入理解Java虚拟机》学习记录
学习笔记目录1.Java内存区域与内存溢出异常1.1.运行时数据区1.1.1.程序计数器1.1.2.Java虚拟机栈和本地方法栈1.1.3.Java堆1.1.4.方法区与常量池(静态常量池与运行时常量池)原创 2020-09-12 21:15:18 · 146 阅读 · 0 评论 -
方法区与常量池(静态常量池与运行时常量池)
方法区方法区与Java堆一样,是各个线程共享的内存区域,它用于存储已经被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。他也有一个别名为"非堆",目的是与Java堆区分开来。方法区和永久代在JDK8以前,很多把方法区和永久代混为一谈,本质上这两者并不是等价的,仅仅是因为当时的HotSpot虚拟机设计团队选择吧收集器的分代设计扩展至方法区,或者说使用永久代来实现方法区而已,这样使得HotSpot的垃圾收集器能够像管理Java堆一样管理方法区的内存,省去专门为方法区编写内存管理的原创 2020-09-12 21:03:48 · 795 阅读 · 1 评论 -
Java堆
Java堆特点:Java堆是虚拟机所管理的内存中最大的一块内存区域他是所有线程共享的内存区域它的生命周期会随着虚拟机的启动而创建,关闭而销毁在Java世界中,几乎所有的对象实例都在这里分配内存它被实现的时候,可以被定义为固定大小的,也可以被定义为可扩展的,当前主流都是可扩展的(通过**-XMS和-XMX**设定)它可以分为很多区域,比如新生代、老年代、永久代,无论分多少个区域其存储的对象只会是实例对象,而创建这些区域的目的是为了更好的进行内存回收垃圾收集器Java堆也是垃圾收集器管理的原创 2020-09-12 19:56:16 · 149 阅读 · 0 评论 -
Java虚拟机栈和本地方法栈
Java虚拟机栈Java虚拟机栈它也是线程私有的一块内存区域,所以生命周期自然和线程相同。每个方法在执行的时候,Java虚拟机栈都会同步生成一个栈帧,然后再将这个栈帧压入Java虚拟机栈中,所以Java虚拟机栈主要保存的就是这个栈帧。栈是一种先进后出的数据结构,所以Java虚拟机栈他只会先处理位于栈顶的栈帧,而位于栈底的栈帧(也就是最先入栈的栈帧)只会等待其上面的栈帧处理完毕了才会被处理。当一个方法从调用到执行完毕,就意味着一个栈帧从Java虚拟机栈中从入栈到出栈的过程。栈帧栈帧主要保存局部变原创 2020-09-12 19:35:38 · 2655 阅读 · 5 评论 -
程序计数器
程序计数器在运行时数据区中,它是线程隔离的一块内存区域,即它是线程私有的内存区域同时它是一块很小的内存区域,可以看做当前线程所执行字节码的行号指示器。即,程序计数器就是用于存放下一条指令所在单元的地址的地方字节码指示器Java虚拟机通过改变计数器的值来选取需要执行的字节码指令,所以它也是程序控制流的指示器,自然Java程序中的分支、循环、跳转、异常处理、线程恢复等都需要依赖这个计数器来完成。例子,线程恢复Java多线程是通过多个线程之间的轮流切换、分配处理器执行时间的方式实现的。在任何一个确定原创 2020-09-12 14:05:27 · 219 阅读 · 0 评论 -
JVM运行时数据区
运行时数据区Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域程序计数器Java虚拟机栈本地方法栈Java堆方法区如下图,该图5个区域就是上面描述的数据区域这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。其中,这5个内存区域中,可以再进行细分线程私有顾名思义,就是线程私有的内存区域程序计数器Java虚拟机栈本地方法栈线程共有顾名思义,线程共用的内存原创 2020-09-12 13:22:56 · 110 阅读 · 0 评论