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…

mysql update 跳过重复_MySQL通过UPDATE / DELETE整合重复的数据记录

我有一个看起来像这样的表:mysql> SELECT * FROM Colors;╔════╦══════════╦════════╦════════╦════════╦════════╦════════╦════════╗║ ID ║ USERNAME ║ RED ║ GREEN ║ YELLOW ║ …

java目录实用工具_JAVA 创建文件和文件夹,删除文件和文件夹的实用工具

package com.file;import java.io.File;import java.io.IOException;//创建新文件和目录public class CCRDFile {// 验证字符串是否为正确路径名的正则表达式private static String matches "[A-Za-z]:\\\\[^:?\">// 通过 sPath.matches(matches) 方法的返回值判…

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的性能会产生较大的影响。因此实际使用中,通常会…

python中location_使用python请求模块时的LocationValueError

我一直在使用请求包与Web进行交互,过去没有任何问题 . 最近当使用我大约一周没用过的脚本时,我在执行例程 requests.get() 调用时遇到以下错误:LocationValueError: No host specified.背景研究经过大量的谷歌搜索 python requests LocationV…

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文档提供前台下载之后就…

java向有序数组里插数_Java向有序数组中插入一个元素,,使其仍按有序排列,并求出这个插入元素的下标...

/*** * create time [2014-4-13]*/public class Test{public static void main(String args[]){//原有序数组,这里约定数组是升序排列int[] intArray new int[]{1,2,4,6,7,9};int toInsert 8;//待插入数据int subscript 0;//下标//确定下标位置if(toInsert {subscript 0;}e…

php 删除文件夹及文件夹,php删除一个路径下的所有文件夹和文件的方法

php遍历一个文件夹内的所有文件和文件夹,并删除所有文件夹和子文件夹下的所有文件的代码,通过递归方式实现达到清空一个目录的效果,代码简单实用。也适合在thinkphp中清理缓存,在thinkphp中可以把下面代码写入./Application/Admin…

PHP制作订货,PHP生成订单号的两种方法

在开发项目的时候经常有生成订单号的需求&#xff0c;这里列出两种生成20位订单号的常用方法。方法一&#xff1a;以下代码是14位当前时间加6位随机数&#xff0c;如果增减位数&#xff0c;只需修改末尾的数字6即可。<?php Function build_order_no(){return date(YmdHis).…

php 分类排序,php将地区分类排序的算法

php将地区分类排序的算法介绍&#xff0c;有需要的朋友可以参考下。写一个函数&#xff0c;用来存储地区数据&#xff1a;复制代码 代码如下:$array array(0>array("","河北"),1>array("","北京"),2>array(0,"保定&quo…

js读写php文件,在js中如何读取本地文件

下面我就为大家分享一篇js读取本地文件的实例&#xff0c;具有很好的参考价值&#xff0c;希望对大家有所帮助。如何用在浏览器端预览本地文件&#xff1f;今天的主题是使用浏览器预览本地文件。由于浏览器安全策略的限制&#xff0c;javascript程序不能自由地访问本地资源&…

php mvc教程 文档,PHP培训教程教你快速打造PHP MVC框架[PHP基础教程]

PHP培训教程教你快速打造PHP MVC框架[PHP基础教程]简介MVC框架在现在的开发中相当流行&#xff0c;不论你使用的是JAVA,C#,PHP或者IOS&#xff0c;你肯定都会选择一款框架。虽然不能保证100%的开发语言都会使用框架&#xff0c;但是在PHP社区当中拥有最多数量的MVC框架。今天你…

java分页代码思路,记录--java 分页 思路 (hibernate关键代码)

有时会脑袋蒙圈&#xff0c;记录下分页的思路下面代码是hibernate的分页&#xff0c;其分页就是从第几条数据为起点&#xff0c;取几条数据。比如在mysql中的limit(5,10)取的就是第6条到第10条在下面代码中的page是页数、size是每页多少条数据String hql"from User";…

php查看运行时间和内存,php 统计时间和内存的使用情况

跳至/*** 记录和统计时间(微秒)和内存使用情况* 使用方法:** G(begin); // 记录开始标记位* // ... 区间运行代码* G(end); // 记录结束标签位* echo G(begin,end,6); // 统计区间运行时间 精确到小数后6位* echo G(begin,end,m); // 统计区间内存使用情况* 如果end标记位没有定…

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

文章前言在2020年8月23日的下午有个憨憨管理在我群艾特全员 说宝塔爆出漏洞了赶快更新吧&#xff01;影响机器需同时满足以下所有条件1、软件版本为Linux面板7.4.2 或者Windows面板6.8.02、开放888且未配置http认证&#xff0c;3、安装了phpmyadmin&#xff0c;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不能访问的解决办法&#xff1a;首先判断文件是否存在&#xff1b;然后设置存在则不rewirte&#xff0c;不存在且符合规则才rewrite&#xff1b;最后修改htaccess文件即可。具体问题&#xff1a;PHP伪静态后不能访问纯html文件.htaccess文件RewriteEngine onRew…