浅谈java内存分析和垃圾收集器
目录:
1.内存分析
2.两种垃圾回收机制和原理
3.对垃圾回收机制的简单理解
1.内存分析:
(1)栈区:
(1)(方法执行的内存模型)也就是说每一个方法执行相关调用都在栈里边,每个方法被调用都会创建一个栈帧(用来储存局部变量、操作数、方法出口等);
(2)jvm(虚拟机)为每个线程创建一个栈(每个程序的执行都会创建很多线程),用于存放该线程执行方法的信息(实际参数局部变量等);
(3)栈属于线程私有,不能实现线程间的共享
(4)栈的存储特性是先进后出,后进先出;
(5)栈是由系统自动分配,速度快,栈是一个连续的内存空间
每调用一个方法就会创建一个栈帧。
是不是异常形象。。
(2)堆区:
1.存放创建好的对象和数组(数组也是对象);
2.jvm只有一个堆,被所有线程共享;
3.堆是一个不连续的空间,分配灵活,速度慢;
3.方法区(也在堆区里边只是方法特殊)
1 . jvm只有一个方法区;
2.实际上也是堆,只是用于存储类,常量相关信息;
3.用来存放程序中不变或者唯一的内容(类信息,静态变量,字符串常量等)
接下来是一个例子来解释上述三种内存空间:
public class oj1{int id;String name;int age;computer comp;void study(){System.out.println("谁他妈买"+comp.brand);//对应下面图片的我在认真学...}void play(){System.out.println("我在斗地主");//对应下面图片的我在玩游戏...}oj1()//构造方法,用于创建类对象{}public static void main(String[] args){oj1 c1=new oj1();computer stu=new computer();stu.brand="小米";//对应联想p.comp=stu;c1.study();}
}
class computer{String brand;//电脑品牌
}
上图可以这么分析,main方法进栈,然后当我们创建一个对象时就会调用对象的构造函数来开辟空间,将对象数据存到堆区中,与此同时在栈内存中生成对应的引用c1引用的是oj1的对象,stu是oj1这个类的成员comp的引用,当我们在后续代码调用的时候用的都是栈内存的引用。同样也可以看出来如果属性是基本数据类型那么会和对象一起存放在堆区,如果属性是对象的引用那么此时的对象只包含引用,所引用的对象会在堆区的另一个空间
1.两种垃圾回收机制和原理:
java不同与c++的是java不用程序员手动释放用完的对象系统自动回收
归功于下面两种算法
(1)引用计数法:
堆中每个对象都有一个引用计数,被引用一次计数加一,引用变量为null则计数减一,直到为0表示无用对象,但对循环引用的无用对象无法识别(如下图)
public class oj1{String name;oj1 friend;public static void main(String[] args) {oj1 p1=new oj1();oj1 p2=new oj1();p1.friend=p2;p2.friend=p1;p1=null;p2=null;}
}
(2)引用可达法:
程序把所有==引用关系看作一张图==,从第一个节点开始,寻找对应的引用节点,当所有引用节点寻找完毕后,剩余节点被认为是没有引用的节点,即无用节点系统自动清除(简单来说就是如果一个对象没有被到达即没有被使用,就会被认为是无用节点);
对垃圾回收机制的简单理解
1.对局部变量的回收
(1)对局部变量:一般局部变量会跟着方法的结束出栈而被回收
(2)对堆区的对象:如果没有引用指向那么系统就会认为是垃圾被回收
(3)对象里边的属性:会随着对象的回收而回收
浅谈java内存分析和垃圾收集器相关推荐
- java方法区对象类型_浅谈Java内存区域与对象创建过程
一.java内存区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区域则 ...
- 浅谈Java内存模型、并发、多线程
浅谈Java内存模型.并发.多线程 Java内存模型(Java Memory Model)是围绕着在并发编程中如何处理原子性,可见性,有序性三个特性而建立的模型. 下面我简单描述一下这三个特性: 原子 ...
- java内存模型浅析_浅谈java内存模型
不同的平台,内存模型是不一样的,但是jvm的内存模型规范是统一的.其实java的多线程并发问题最终都会反映在java的内存模型上,所谓线程安全无非是要控制多个线程对某个资源的有序访问或修改.总结jav ...
- java 内存分配参数_浅谈JAVA内存分配与参数传递
java中方法的参数传递方式只有一种:值传递. java内存分配: 1.栈:存放 基本类型的数据.对象的引用(类似于c语言中的指针) 2.堆:存放用new产生的数据 3.静态域:存放在对象中用stat ...
- 浅谈java内存分配和回收策略
一.导论 java技术体系中所提到的内存自动化管理归根结底就是内存的分配与回收两个问题,之前已经和大家谈过java回收的相关知识,今天来和大家聊聊java对象的在内存中的分配.通俗的讲,对象的内存分配 ...
- 浅谈Java内存泄漏问题
2019独角兽企业重金招聘Python工程师标准>>> One of the most significant advantages of Java is its memory ma ...
- java eden space_《深入理解Java虚拟机》(六)堆内存使用分析,垃圾收集器 GC 日志解读...
堆内存使用分析,垃圾收集器 GC 日志解读 重要的东东 在Java中,对象实例都是在堆上创建.一些类信息,常量,静态变量等存储在方法区.堆和方法区都是线程共享的. GC机制是由JVM提供,用来清理需要 ...
- 浅谈Metaspace内存溢出原因及JVM参数设置
浅谈Metaspace内存溢出原因及JVM参数设置 1.Metaspace内存溢出(oom) 日志 原因分析 从Java8开始,Java中的内存模型引入了一个称为元空间(Metaspace)的新内存区 ...
- java 多线程同步_浅谈Java多线程(状态、同步等)
Java多线程是Java程序员必须掌握的基本的知识点,这块知识点比较复杂,知识点也比较多,今天我们一一来聊下Java多线程,系统的整理下这部分内容. 一.Java中线程创建的三种方式: 1.通过继承T ...
最新文章
- 一个简单的用Python写抽奖程序
- Runtime.getRuntime().exec
- [APP] Android 开发笔记 001-环境搭建与命令行创建项目
- 27代理模式(Proxy Pattern)
- Ray.tune可视化调整超参数Tensorflow 2.0
- np.linalg.norm()用法
- 西南交通大学计算机组成原理,西南交通大学计算机组成原理课程设计报告
- Python机器学习笔记:异常点检测算法——Isolation Forest
- dateformat java 并发_SimpleDateFormat并发隐患及其解决
- 手把手教你实现热更新功能,带你了解 Arthas 热更新背后的原理
- 小白如何开始学习计算机编程?
- 科学计算机imissyou,imissyou是什么意?imissyou – 手机爱问
- 常用Java编程软件有哪些
- 软件安全测试都有哪些内容,如何选择软件安全测评机构
- 阿里巴巴战略发展史(转)
- 01、UART串口通信
- 记录每天背的单词,准备考研。(4月11日)
- 文件夹成变成.exe 解决办法
- bmp180气压传感器工作原理_【科普】40种传感器工作原理
- 2011互联网大会23日在京举行 微博带您对话CEO
热门文章
- Python数据分析很难学?60天就够了!
- ASP.NET Core实现类库项目读取配置文件
- spring+mybatis+atomikos 实现JTA事务
- ECSHOP发送邮件提示need rcpt command的解决方法
- [原创]RCP项目:数字图像处理软件
- 答TOGAF企业架构的一些问题
- [摘抄]一些软件设计的原则
- 专家:四大问答指出混合云的应用之路
- 快速消费品行业的营销费用的管理(2)----营销费用的分类
- 中英文怎么算 字符长度_如何将混合了中英文及不同数量空格的文本,快速拆分成多列...