切换导航
首页
技术问答
编程语言
前端开发
移动开发
开发工具
程序设计
行业应用
CMS系统
服务器
频道导航
▸ PHP
▸ Java
▸ Java SE
▸ Python
▸ C#
▸ C&C++
▸ Ruby
▸ VB
▸ asp.Net
▸ Go
▸ Perl
▸ netty
▸ Django
▸ Delphi
▸ Jsp
▸ .NET Core
▸ Spring
▸ Flask
▸ Springboot
▸ SpringMVC
▸ Lua
▸ Laravel
▸ Mybatis
▸ Asp
▸ Groovy
▸ ThinkPHP
▸ Yii
▸ swoole
▸ HTML
▸ HTML5
▸ JavaScript
▸ CSS
▸ jQuery
▸ Bootstrap
▸ Angularjs
▸ TypeScript
▸ Vue
▸ Dojo
▸ Json
▸ Electron
▸ Node.js
▸ extjs
▸ Express
▸ XML
▸ ES6
▸ Ajax
▸ Flash
▸ Unity
▸ React
▸ Flex
▸ Ant Design
▸ Web前端
▸ 微信小程序
▸ 微信公众号
▸ iOS
▸ Android
▸ Swift
▸ Hybrid
▸ Cocos2d-x
▸ Flutter
▸ Xcode
▸ Silverlight
▸ cocoa
▸ Cordova
前端之家
JVM
005、JVM的垃圾回收机制是用来干嘛的?为什么要垃圾回收?
005、JVM的垃圾回收机制是用来干嘛的?为什么要垃圾回收?
2020-08-09
JVM
前端之家
前端之家
收集整理的这篇文章主要介绍了
005、JVM的垃圾回收机制是用来干嘛的?为什么要垃圾回收?
,
前端之家
小编觉得挺不错的,现在分享给大家,也给大家做个参考。
本文是个人
内容
总结,详细
内容
扫描
二维码
1.前文回顾
脑子里一定要有一个会动的图:
1、启动一个线程执行业务
代码
(执行main
方法
就是开启一个main线程);
2、线程对应的程序计数器PC来记录程序执行到哪行字节码指令(线程与PC是1:1关系);
3、
调用
方法
时会创建一个“栈帧”,放入线程对应的栈中(线程与栈、
方法
和栈帧都是1:1关系)
4、
代码
运行中创建的对象放在java堆内存(堆与JVM进程是1:1关系,堆是所有进程共享)
2.对象的分配与引用
1、启动main线程并创建与其对应的栈(称M栈),创建main
方法
对应的栈帧并压入栈
2、main
方法
调用
loadReplicasFromDisk():创建
方法
的栈帧压入M栈,栈帧中会放入
方法
中的局部变量repliaManager
3、repliaManagerl.load():创建load对应栈帧,压入M栈
3.一个
方法
执行完毕后会怎样?
方法
执行结束则栈帧出栈,线程结束则线程对应的栈也会被销毁。DS:这时候堆中的对象就失去了出栈
方法
中变量的引用,注意此时有可能还有别的线程中的变量在引用,不能认为他现在就是个
垃圾
对象。
垃圾
回收进行可达性分析,会分析所有栈中的变量对对象的引用,没有引用就是
垃圾
对象
4.我们创建的Java对象其实都是占用内存资源的
启动的Java系统本质就是一个JVM进程,进程本身也会占用内存资源
Java堆内存里创建的对象,都是占用内存资源的,而且内存资源有限
5.不再需要的那些对象应该怎么处理?
引用堆中对象的变量所在的
方法
执行完了,那么堆中的对象就成了“
垃圾
”,白白占用着堆内存空间
启动JVM进程会
自动
启动一个
垃圾
回收的Daemon线程。DS: 可以通过 jconsole来查看,线程里会有一个名字叫做“GC Daemon”的线程
6.本文小结
实例分析了程序执行过程:开启线程,创建栈,创建栈帧,创建
对象
,占用堆内存,引用对象,
方法
执行完,栈帧出栈,对象失去引用,
垃圾
收集器收集
7、问题总结
1、很多人在做数据导出的时候会在for循环中不断的创建对象,很容易造成堆溢出,这种大
文件
导出怎么破?
答:在循环外面创建一个对象,循环里对这个对象
修改
数据即可
2、
方法
执行完后,栈帧立马出栈,那么栈帧中的变量等数据是立马被回收掉么,还是需要等
垃圾
回收线程进行回收?
答:出栈就没了。DS:
垃圾
收集器收集的是堆中的对象,栈帧的存储空间分配在 Java 虚拟机栈之中,每一个栈帧都有自己的局部变量表、操作数栈和指向当前
方法
所属的类的运行时常量池的引用。
3、为什么堆中对象需要
垃圾
收集器进行收集,而栈帧中的
内容
不需要呢?
答:堆是所有线程共享的,对象能不能回收需要
垃圾
收集器使用算法进行判断。而栈帧是
方法
私有的,
方法
执行完,直接清除里面的
内容
,不需要考虑类似堆中对象的问题。
8、针对一些疑问补充
内容
类的加载:将类的.class
文件
二进制数据读入内存(运行时数据区的
方法
区),然后在内存中(Hotspot是
方法
区)创建java.lang.Class的对象,该对象用来封装类的数据结构。比如ArrayList.class.getDeclaredFields();通过封装ArrayList类的数据结构Class对象,
获取
类声明的字段
上一篇:jvm调优
下一篇:深扒JVM,对它进行“开膛破肚”式解
猜你在找的JVM相关文章
java class文件详解
一、概述 各种不同平台的Java虚拟机, 以及所有平台都统一支持的程序存储格式——字节码(...
作者:前端之家 时间:2021-02-27
想写一篇jvm的工具入门
为什么要写一个jvm的工具入门呢,一是自己也不会,二是因为不会所以想学一下,还有就是这个...
作者:前端之家 时间:2021-02-27
java虚拟机类加载机制详解
一、概述 1.1、概念 Java虚拟机把描述类的数据从Class文件加载到内存, 并对数据进行校验、...
作者:前端之家 时间:2021-02-27
java虚拟机概述
想了好久,还是决定写一个jvm的一个系列,学习java基础,我感觉必须要动要动一下jvm,不然...
作者:前端之家 时间:2021-02-27
Java自动内存管理机制学习(二):垃圾回收器与内存分配策略
备注:本文引自《深入理解Java虚拟机第二版》仅供参考 图片来自:http://csdn.net/WSYW126...
作者:前端之家 时间:2021-02-25
Java并发编程学习:volatile关键字解析
转载:https://www.cnblogs.com/dolphin0520/p/3920373.html 写的非常棒,好东西要分享一下...
作者:前端之家 时间:2021-02-25
JVM垃圾收集器
前言 最近被问到了JVM的垃圾收集器,在此进行整理记录,供大家一起学习。 jvm垃圾收集器 j...
作者:前端之家 时间:2021-02-14
win10安装JDK详细教程
电脑进行了重装机器。需要重新安装,在此记录一下。 点击下一步。选择安装路径 。 等待后,...
作者:前端之家 时间:2021-02-14
jvm的垃圾回收机制
一、jvm内存的分区 JVM的内存结构包括五大区域:程序计数器、虚拟机栈、本地方法栈、堆区、...
作者:前端之家 时间:2021-02-14
如何关闭jdk自动更新提示
缘由 国庆将电脑重装了一下,jdk自然也就重装了,一开机总是提示我更新,索性就将他关掉。...
作者:前端之家 时间:2021-02-14
编程分类
Git
GitHub
SVN
Jenkins
SSH
Jmeter
sysTemd
Maven
Webpack
Zookeeper
Kubernetes
Phpstorm
JVM
IDEA
HBuilder
安装教程
开发工具
Markdown
Mac
Pytest
Selenium
istio
Gradle
Tensorflow
最新文章
• java class文件详解
• 想写一篇jvm的工具入门
• java虚拟机类加载机制详解
• java虚拟机概述
• Java自动内存管理机制学习
• Java自动内存管理机制学习
• Java并发编程学习:volati
• JVM垃圾收集器
• win10安装JDK详细教程
• jvm的垃圾回收机制
热门标签
更多 ►
Git教程
敏感问题
MVP模式
Webstorm使用
webstorm无法
windows 系统
Window 上安装
安装SVN并进行
TortoiseSVN切
打包流程
HBuilder
docsify
svn教程
tortoisegit
Easy Digital
tagit
git安装
Node.js搭建g
github
github预览vu
mpvue开发git
mpvue开发git
gitee
ctype_digit
SVN
调用SVN命令
git自动部署
git
svn版本
内置svn函数