java姑娘_初识java这个小姑娘(二)

正版疯狂java讲义第5版编程教材

76.5元

(需用券)

去购买 >

b1a034ada12a353f0db5946c5181165b.png

妙解垃圾回收机制

周一,早高峰!!!

五个字,说尽心中的绝望!!!

一段考验一个人耐力、智力、开车技术以及脾气的路。 我把车开进了一个没有红绿灯的丁字路口,然后就没有然后了。

来自三个方向的大车小车开始在不大的一块空间里开始互相斗智斗勇,但是最终的结果永远是伤敌一千,自损八百。

这种崩溃的心情应该很多人都体会过,特别是本来不用迟到,但是堵车却能让你迟到上好几个小时。

在所有人都陷入绝望的时候,交警同志终于到达现场,开始疏散车辆。

那些给我贴罚单的“讨厌”的人,一下子变成了无比高大的存在。

此时已经是快要九点半了,快要两个小时的时间,我竟然只挪动了两米不到。

一刹那间,我终于体会到什么是垃圾回收机制,你能体会吗?

使用java进行编程,但是从来没有去思考过这个问题的小伙伴们?

这个巨大的丁字路口,可以理解为内存,可以允许有限的车辆在里面通行。

当车辆不停地始驶入,就像是无数的线程都要放到内存中,需要被处理。

终于,内存爆了。接下来的一幕就是内存溢出,停止工作。

那些已经被不会被使用的垃圾线程依然停留在内存当中,就好像横在我眼前的这个大卡车。(当然对我来说,除了我之外的所有的车辆都是垃圾,应该被回收掉)

这个时候,内心里有一个声音:如果有人能把它们带走就好了。

于是,交警来了,他就是java中的垃圾回收机制。

他以极快的速度把所有停滞在内存当中的废弃线程快速的清除出去。

于是,终于,一切又开始高速的运转开来。

在java之前众多的编程语言,都是通过编程人员自己来清除内存中已经被废弃掉的无用线程或者对象。

使得程序员的精力过多的消耗在了系统上。

如果系统自身可以完成这部分工作,程序员就能够更多的去关注业务本身而不是系统效率。

这样做的好处是解放程序的大脑,但是坏处也是显而易见的。

那就是系统提供的垃圾回收机制无法做到像人工操作一样,在第一时间就知道代码中的对象已经使用完毕,而立即清除。

系统需要固定的时间和固定的方式来做这件事情。

好在通过jdk不断升级,java语言的维护团队对效率做了很大的优化。

在开始详细介绍垃圾回收机制的工作原理之前,有一个小小的思维拓展。

我记得刚开始接触到java的时候,老师讲对象在内存中的存储时,总是告诉我,引用存储在栈中,而对象是存储在堆中。

老实说,即使是几年之后,如此抽象的讲解依然让我无法理解java的底层工作到底是怎样的?

而所谓的栈,堆又到底是什么,根本没有一个解释能让人直观的理解程序在内存中到底是怎样进行工作的。

那么说一些我自己的理解。

众所周知,计算机所有的工作原理是建立在二进制上。

所谓二进制,课本告诉我们是由1,0组成的一种进制,而原因是机器只能识别二进制。

好吧,关于二进制其实也是云雾缭绕的存在,我现在特别不理解在课堂上老师怎么能如此官面的解释二进制。

我们输入指令,计算机要做的事情有两个,第一是识别这道指令,第二是执行这道指令。

那么是否可想想象二进制的存储方式就是一种信息的表达,就是把1,0按照机器能够识别的记录顺序进行排序,而计算机通过阅读这一串1,0组成的机器码,了解了指令的内容。

然后它处理完这道指令之后,又以1,0的方式反馈给我们,这种二进制的信息存储最终被翻译成了我们能够识别的文字,音乐,图像等等。

说到底,二级制就是一种信息的存储方式罢了。

那么所谓的栈,是否可以理解为java虚拟机将内存中的某一块区域指定为栈,这块区域是通过1,0 的方式存储指令。

内存就像二元矩阵,而虚拟机划分了一块作为栈或者堆。

这种指定本身也不是固定,也许下一次虚拟机指定了另外的地方。

如此是否可以更好地理解所谓的栈和堆呢。

不过是强行划分的内存区域,并且在这个区域中是按照java虚拟机指定的规则进行数据的存储和阅读的。

不知这样的理解是否正确,还请指正。

下面说说java的回收机制到底是怎么工作的。

1.stop-the-world这几个字一度让我觉得这不是代码,而是诗。

是怎样的一个诗人,才能给这段程序如此诗意的一个名字。

Stop-the-world意味着 JVM 因为要执行GC而停止了应用程序的执行。

当Stop-the-world发生时,除了GC所需的线程以外,所有线程都处于等待状态,直到GC任务完成。

GC优化很多时候就是指减少Stop-the-world发生的时间。

2.垃圾回收机制是怎样辨别哪些对象是需要进行回收的?在此时我们大体梳理一下整个过程。

在Java中,开发人员无法直接在程序代码中清理内存,而是由垃圾回收器自动寻找不必要的垃圾对象,并且清理掉他们。

垃圾回收器会在下面两种假设(hypotheses)成立的情况下被创建(称之为假设不如改为推测(suppositions)或者前提(preconditions))。

大多数对象会很快变得不可达

只有很少的老年对象(创建时间较长的对象)指向新生对象的引用

这些假设我们称之为弱年代假设(weak generational hypothesis)。

为了强化这一假设,虚拟机将其物理上划分为两个–新生代(young generation)和老年代(old generation)。

新生代(Young generation):绝大多数最新被创建的对象会被分配到这里,由于大部分对象在创建后会很快变得不可到达,所以很多对象被创建在新生代,然后消失。对象从这个区域消失的过程我们称之为”minor GC“。

老年代(Old generation):对象没有变得不可达,并且从新生代中存活下来,会被拷贝到这里。其所占用的空间要比新生代多。也正由于其相对较大的空间,发生在老年代上的GC要比新生代少得多。对象从老年代中消失的过程,我们称之为”major GC“(或者”full GC“)

新生代的构成

为了更好地理解GC,我们现在来学习新生代,新生代是用来保存那些第一次被创建的对象,他可以被分为三个空间

一个伊甸园空间(Eden)

两个幸存者空间(Survivor)

一共有三个空间,其中包含两个幸存者空间。每个空间的执行顺序如下:

绝大多数刚刚被创建的对象会存放在伊甸园空间。

在伊甸园空间执行了第一次GC之后,存活的对象被移动到其中一个幸存者空间。

此后,在伊甸园空间执行GC之后,存活的对象会被堆积在同一个幸存者空间。

当一个幸存者空间饱和,还在存活的对象会被移动到另一个幸存者空间。

之后会清空已经饱和的那个幸存者空间。

在以上的步骤中重复几次依然存活的对象,就会被移动到老年代。

如果你仔细观察这些步骤就会发现,其中一个幸存者空间必须保持是空的。

如果两个幸存者空间都有数据,或者两个空间都是空的,那一定标志着你的系统出现了某种错误。

老年代GC处理机制

老年代空间的GC事件基本上是在空间已满时发生,执行的过程根据GC类型不同而不同。

到此为止,是否可以更加直观的理解所谓垃圾回收机制.

这是我对java语言的一些简单理解,原创作品,欢迎关注同名微信订阅号:程序员与工匠。

欢迎各位大大扫描下方二维进

行关注。

原文链接:http://www.cnblogs.com/zccxy/p/8041974.html

java 11官方入门(第8版)教材

79.84元

包邮

(需用券)

去购买 >

f0f3f55624fb396b1764d42d6df88864.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA script 循环 图片_深入分析JavaScript 事件循环(Event Loop)

事件循环(Event Loop),是每个JS开发者都会接触到的概念,但是刚接触时可能会存在各种疑惑。众所周知,JS是单线程的,即同一时间只能运行一个任务。一般情况下这不会引发问题,但是如果我们有一个耗时较多的任务&#xff0…

java 方法重载的作业_java第六章 方法及方法重载 课堂笔记、作业

当参数传递为基本数据类型时,参数变化不保留,基本数据类型参数传值当参数传递为引用数据类型时,参数变化会保留,引用数据类型参数传址//基本数据类型在别处被重新赋值,则本体不受影响,其值不变//引用型数据…

java旋转图片后边上变黑_Java旋转图像将背景的一部分变成黑色

因此,我下载了“原始”图像(不是正方形),对其进行了修改,使其变为正方形,运行您的代码,得到了java.awt.image.ImagingOpException:无法转换src图像异常,将BufferedImage.TYPE_INT_RGB更改为BufferedImage .TYPE_INT_ARGB并得到…import java.awt.geom.AffineTransfo…

python 数据库连接池_【转】Python 数据库连接池

python编程中可以使用pymysql进行数据库连接及增删改查操作,但每次连接mysql请求时,都是独立的去请求访问,比较浪费资源,而且访问数量达到一定数量时,对mysql的性能会产生较大的影响。因此实际使用中,通常会…

java 获取oracle表结构_获取Oracle中所有表的列表?

回答(19)2 years ago我们可以从以下查询获取所有表格,包括列详细信息:SELECT * FROM user_tab_columns;2 years ago使用sqlplus更好地查看如果您正在使用 sqlplus ,您可能需要首先设置一些参数以便在您的列被破坏时更好地查看(退出 sqlplus 会…

java后台处理excel_java后台利用Apache poi 生成excel文档提供前台下载示例

之前在项目中会用到在java在后台把数据填入Word文档的模板来提供前台下载,为了自己能随时查看当时的实现方案及方便他人学习我写了这篇博客,访问量已经是我写的博客里第一了。于是乎我在学会用Java在后台利用Apache poi 生成excel文档提供前台下载之后就…

宝塔php漏洞,[安全预警]关于最近宝塔闹得很厉害的PMA漏洞BUG

文章前言在2020年8月23日的下午有个憨憨管理在我群艾特全员 说宝塔爆出漏洞了赶快更新吧!影响机器需同时满足以下所有条件1、软件版本为Linux面板7.4.2 或者Windows面板6.8.02、开放888且未配置http认证,3、安装了phpmyadmin,mysql数据库不受…

求十个学生的平均成绩java,JAVA 声明一个数组,存一个学生的五门成绩。求该学生的总成绩、平均成绩。...

JAVA 声明一个数组,存一个学生的五门成绩。求该学生的总成绩、平均成绩。mip版 关注:116 答案:3 悬赏:30解决时间 2021-01-26 06:39已解决2021-01-25 17:54声明一个数组,存一个学生的五门成绩。求该学生的总成绩、平均成绩。JAVA知识最佳答案2021-01-25 18:12public class S…

php伪静态限制网页播放视频,学习猿地-php伪静态后html不能访问怎么办

php伪静态后html不能访问的解决办法:首先判断文件是否存在;然后设置存在则不rewirte,不存在且符合规则才rewrite;最后修改htaccess文件即可。具体问题:PHP伪静态后不能访问纯html文件.htaccess文件RewriteEngine onRew…

oracle binary_integer pls_integer,oracle中binaryinteger与plsinteger的区别

oracle中binaryinteger与plsinteger的区别 Oracle 中 Binary_Integer 与 Pls_Integer 的区别Binary_Integer 与 Pls_Integer 都是整型类型. Binary_Integer 类型变量值计算是由 Oracle 来执行,不会出现溢出,但是执行速度较慢,因为它是由 Orac…

梁单元分析matlab,[FEM][有限元][编程][Matlab][Code by myself] 2D Timoshenko梁单元

(有空和小伙伴一起写写有限元程序)程序作者 ( Author )JiDong Cui (崔济东)1, XueLong Shen (沈雪龙)21.广州容柏生建筑结构设计事务所;2.华南理工大学建筑设计研究院基本概念 ( Concept )欧拉梁单元基于一定的假设(Kirchhoff假设),在梁的高度远小于其跨…

oracle分组后伪列,Oracle伪列和伪表和分组函数(row_number,Rank)

oracle的伪列以及伪表oracle系统为了实现完整的关系数据库功能,系统专门提供了一组成为伪列(Pseudocolumn)的数据库列,这些列不是在建立对象时由我们完成的,而是在我们建立时由Oracle完成的。Oracle目前有以下伪列:一、伪列&#…

linux运行搜狗拼音,Linux 搜狗输入法的安装(Ubuntu版)

1、首先从搜狗官网下载搜狗输入法Linux版本的安装包2、按ctrl alt T 打开Linux终端3、安装搜狗输入法: sudo dkpg -i xxx.deb, 如果报错,主要是由于两个原因:a、权限不够,可以通过获取root权限,命令‘su’;…

2023年腾讯云轻量应用服务器测评2核2G4M带宽

腾讯云轻量应用服务器测评2核2G4M带宽88元一年,2核CPU、2G内存、3M带宽,腾讯云轻量应用服务器(Tencent Cloud Lighthouse)是一款开箱即用的云服务器产品,面向轻量应用场景,旨在为中小企业和开发者提供便捷高…

linux tcp连接计算机,计算机基础知识——linux socket套接字tcp连接分析

2016.7.4今天晚上对项目顶层文件(daemon)进行了分析,对其中的TCP连接进行具体的代码级分析。1、需求分析首先得知道我们这里为什么要用TCP连接,我们的整个测试系统是由上位机作为客户端,发送测试文件,测试命令给我们测试程序上&am…

定时器驱动数码管c语言程序,74hc595驱动数码管时间程序

74hc595驱动数码管时间程序这里是电路图:下面是51单片机驱动74hc595芯片的程序:#include //包含51单片机的头文件#include#define uint unsigned int#define uchar unsigned char//sbit sin_595 P1^0;//sbit rclk_595 P…

石油大学c语言考试答案,中石油华东2012春《C语言》在线答案

);! X" l4 d0 m5 T0 A 满分:2 分* }4 x X$ a& t, l% i3. 当对两个字符串进行比较时,应该使用的函数是A. strcat, y, Z- S p t! k! GB. strcmp2 } R% s8 P* Z/ yC. strcpy, i$ q. b5 P8 m j v1 k3 H2 W3 mD. strlen* I B S…

c语言中怎么暂停一个一个游戏,求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束...

求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束/*以下是主要的逻辑代码,还有些.c和.h就没发了*/#i…

android view显示隐藏动画效果,Android 根据手势顶部View自动展示与隐藏效果

首先来看一下效果:大体思路如下:总体布局用了一个自定义的ViewGroup,里面包了两个View(top View,bottomView)我在bottomView里放了ViewPager,里面又有Fragment,Fragment里放的是ListView原理:Vi…

android点击地址调用地图,Android 实现点击按钮 调用手机外部地图导航

//弹出Dialog 选择外部地图private void setMap(){final Dialog dianew AlertDialog.Builder(mContext).create();View viewLayoutInflater.from(mContext).inflate(R.layout.dialog_map, null);dia.show();dia.getWindow().setContentView(view);TextView tv_baidu(TextView) …