watermark

图解 Java 垃圾回收机制,写得非常好!

夙愿已清 提交于 2020-08-09 05:49:19
什么是自动垃圾回收? 自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制。 所谓使用中的对象(已引用对象),指的是程序中有指针指向的对象;而未使用中的对象(未引用对象),则没有被任何指针给指向,因此占用的内存也可以被回收掉。 在用 C 之类的编程语言时,程序员需要自己手动分配和释放内存。而 Java 不一样,它有垃圾回收器,释放内存由回收器负责。本文接下来将介绍垃圾回收机制的基本过程。 第一步:标记 垃圾回收的第一步是标记。垃圾回收器此时会找出哪些内存在使用中,还有哪些不是。 上图中,蓝色表示已引用对象,橙色表示未引用对象。垃圾回收器要检查完所有的对象,才能知道哪些有被引用,哪些没。如果系统里所有的对象都要检查,那这一步可能会相当耗时间。关注Java技术栈微信公众号,回复:JVM46,可以获取一份超全 JVM 调优攻略。 第二步:清除 这一步会删掉标记出的未引用对象。 内存分配器会保留指向可用内存的引用,以供分配新对象。 压缩 为了提升性能,删除了未引用对象后,还可以将剩下的已引用对象放在一起(压缩),这样就能更简单快捷地分配新对象了。 为什么需要分代垃圾收集? 之前说过,逐一标记和压缩 Java 虚拟机里的所有对象非常低效:分配的对象越多,垃圾回收需时就越久。不过,根据统计,大部分的对象,其实用没多久就不用了。 来看个例子吧。(下图中

网络模型介绍

南楼画角 提交于 2020-08-09 02:58:00
物理层主要作用是定义物理设备如何传输数据 数据链路层在通信的实体间建立数据链路连接 网络层为数据在结点之间传输创建逻辑链路 传输层 向用户提供可靠的端到端(End-to-End)服务 传输层向高层屏蔽了下层数据通信的细节 应用层 为应用软件提供了很多服务 构建与TCP协议之上 屏蔽网络传输相关细节 来源: oschina 链接: https://my.oschina.net/u/2441327/blog/4310661

付费?是不可能的!20行Python代码实现一款永久免费PDF编辑工具

不羁岁月 提交于 2020-08-08 20:01:40
PDF(Portable Document Format),中文名称便携文档格式是我们经常会接触到的一种文件格式,文献、文档...很多都是PDF格式。它以格式稳定的优势,使得我们在打印、分享、传输过程中能够最优的保持原有色彩和格式。 PDF是以PostScript语言图像模型为基础的一种文档格式,它在格式的稳定性方面虽然具有很大优势。但是,在可编辑性方面却为使用者引入了另外一个困扰。 例如,在文档的分割、合并、剪切、转换、编辑等方面PDF就有些捉襟见肘了。 Adobe Reader、福昕阅读器、熊猫PDF...经常用到的PDF工具只能用于文档阅读,但是免费版都不可以用于文档编辑。虽然,网页版PDF工具,例如SmallPDF、I love PDF可以用于PDF的编辑,但是对于文档大小也有限制。 曾经,为了替换PDF中的一页,我几乎试遍了所有市面上主流的PDF工具,最终还是不得不选择使用付费工具来解决问题。 事后想了想,既然这些商业化软件不靠谱,为什么不考虑自己动手开发一款工具呢?明明几十行代码能够解决的问题,为什么要费那么多劲去下载、安装那些没有节操的软件呢? 本文就来介绍一下利用Python轻松开发一款PDF编辑工具,可以用于PDF转TxT、分割、合并、剪切、转换。 PyPDF2 PyPDF2是一个第三方的python PDF库,它能够对PDF文件进行分割、合并、裁剪和转换页面。

面试题:Java对象不再使用时,为什么要赋值为null?

时间秒杀一切 提交于 2020-08-08 18:09:04
前言 许多Java开发者都曾听说过“不使用的对象应手动赋值为null“这句话,而且好多开发者一直信奉着这句话;问其原因,大都是回答“有利于GC更早回收内存,减少内存占用”,但再往深入问就回答不出来了。 鉴于网上有太多关于此问题的误导,本文将通过实例,深入JVM剖析“对象不再使用时赋值为null”这一操作存在的意义,供君参考。本文尽量不使用专业术语,但仍需要你对JVM有一些概念。 示例代码 我们来看看一段非常简单的代码: public static void main(String[] args) { if (true) { byte[] placeHolder = new byte[64 * 1024 * 1024]; System.out.println(placeHolder.length / 1024); } System.gc(); } 我们在if中实例化了一个数组placeHolder,然后在if的作用域外通过System.gc();手动触发了GC,其用意是回收placeHolder,因为placeHolder已经无法访问到了。来看看输出: 65536 [GC 68239K->65952K(125952K), 0.0014820 secs] [Full GC 65952K->65881K(125952K), 0.0093860 secs] Full GC 65952K-

Java Class类

送分小仙女□ 提交于 2020-08-08 17:53:24
1、简介 在java世界里,一切皆对象。从某种意义上来说,java有两种对象:实例对象和Class对象。每个类的运行时的类型信息就是用Class对象表示的。它包含了与类有关的信息。其实我们的实例对象就通过Class对象来创建的。Java使用Class对象执行其RTTI(运行时类型识别,Run-Time Type Identification),多态是基于RTTI实现的。    Class 类的实例表示正在运行的 Java 应用程序中的类和接口。 每一个类都有一个Class对象( 类A,类A的对象a1, 用双等号操作符来比较对象:a1.getClass()==A.class;应该返回的是true。 ),每当编译一个新类就产生一个Class对象,基本类型 (boolean, byte, char, short, int, long, float, and double)有Class对象,数组有Class对象,就连关键字void也有Class对象(void.class)。Class对象对应着java.lang.Class类,如果说类是对象抽象和集合的话,那么Class类就是对类的抽象和集合。   Class类没有公共的构造方法,Class对象是在类加载的时候由Java虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的,因此不能显式地声明一个Class对象

【了不起的开发者】华为开发者大会2020(Together)已向你发来邀请~

淺唱寂寞╮ 提交于 2020-08-08 15:39:55
2019华为开发者大会在东莞松山湖举行 大会以”AI&IRethink Possibilities”为主题 汇集全球5000+合作伙伴和开发者 共同探讨全场景智慧化的未来趋势 开启全球终端产业革命性体验。 华为开发者大会2020(Together)如约而至 9月10日起,我们将在东莞松山湖 带来主题演讲、技术论坛、和行业大咖的松湖对话 加入Codelabs与全球开发者一同感受代码魅力 加入Tech. Hour与华为专家 一对一聊技术、交朋友,碰撞出新的火花 更有好玩又有趣的互动体验,等你一起来探索 无论是以何种方式参与 我们都欢迎您的到来 点击“ 了解详情 ”选择门票种类,挑选适合你的门票! (提交支付前请核实报名信息) 来这里,让你从强变得更强 让你看见世界,被世界看见 精彩不止于此 华为开发者! 9月10日 ,我们不见不散! 原文链接: https://developer.huawei.com/consumer/cn/forum/topicview?tid=0203319447822070008&fid=23 原作者:洛惜陌 来源: oschina 链接: https://my.oschina.net/u/4478396/blog/4479292

安装升级最新版本postman时遇到“无法定位程序输入点 SetDefaultDllDirectories于动态链接库KERNEL32.dll 上.”的问题

半世苍凉 提交于 2020-08-08 13:52:10
软件版本迭代更新真快,最近升级最新Postman版本时出现以下问题 我就简单纪录下解决办法: 备注:我用的是最新的postman工具包:Postman-win64-7.25.0-Setup.exe,目前是最新 0. 前提是已经到postman官网 https://www.postman.com/downloads/ 下载好软件工具包 1. 安装window7系统更新补丁KB2533623,请到微软公司官网 https://support.microsoft.com/en-us/help/2533623/microsoft-security-advisory-insecure-library-loading-could-allow-remot 下载对应的补丁包 2. 下载完成后,双击运行 Windows6.1-KB2533623-x64.msu 即可 注意安装完补丁后,机器需要重启 3. 再次安装新版本Postman 双击运行 Postman-win64-7.25.0-Setup.exe 步骤进行中 稍等会有点慢,这个依赖需要网络下载,安装完依赖后提示系统又需要重新启动, 机器重新启动后,再次点击postman程序包即可完成安装 大功告成!!! 后记: 如果可以,请配置好的电脑,升级最新的操作系统比如win10,不像以前,几十兆就能运行程序

优秀的 Java 项目代码都是如何分层的?

自闭症网瘾萝莉.ら 提交于 2020-08-08 12:44:24
1、背景 说起应用分层,大部分人都会认为这个不是很简单嘛 就controller,service, mapper三层。看起来简单,很多人其实并没有把他们职责划分开,在很多代码中,controller做的逻辑比service还多,service往往当成透传了,这其实是很多人开发代码都没有注意到的地方,反正功能也能用,至于放哪无所谓呗。这样往往造成后面代码无法复用,层级关系混乱,对后续代码的维护非常麻烦。 的确在这些人眼中分层只是一个形式,前辈们的代码这么写的,其他项目代码这么写的,那么我也这么跟着写。但是在真正的团队开发中每个人的习惯都不同,写出来的代码必然带着自己的标签,有的人习惯controller写大量的业务逻辑,有的人习惯在service中之间调用远程服务,这样就导致了每个人的开发代码风格完全不同,后续其他人修改的时候,一看,我靠这个人写的代码和我平常的习惯完全不同,修改的时候到底是按着自己以前的习惯改,还是跟着前辈们走,这又是个艰难的选择,选择一旦有偏差,你的后辈又维护你的代码的时候,恐怕就要骂人了。 所以一个好的应用分层需要具备以下几点: 方便后续代码进行维护扩展; 分层的效果需要让整个团队都接受; 各个层职责边界清晰。 2、如何进行分层 2.1、阿里规范 在阿里的编码规范中约束的分层如下: **开放接口层:**可直接封装 Service 方法暴露成 RPC 接口;通过

Spring Enable***功能

懵懂的女人 提交于 2020-08-08 06:20:46
spring博大精深,衍生出了两大系列:spring boot 和sping cloud快速业务开发模式。 我们进行具体开发时,经常看到这样以Enable*开头的注解,如图 等等好多例子。。。框架自带的Enable* @EnableAspectJAutoProxy 开启对AspectJ自动代理的支持 @EnableAsync 开启异步方法的支持 @EnableScheduling 开启计划任务的支持 @EnableWebMvc 开启Web MVC的配置支持 @EnableConfigurationProperties 开启对 @ConfigurationProperties 注解配置Bean的支持 @EnableJpaRepositories 开启对SpringData JPA Repository的支持 @EnableTransactionManagement 开启注解式事务的支持 @EnableCaching 开启注解式的缓存支持 看到不少网文吹嘘的上天了、神乎其威,我只说一句话: 它(指Enable*)只是一种注解 ,可参考我的博文: Spring中@Import的三种情况 https://my.oschina.net/u/154866/blog/4290666 和 Spring Bean注册的几种方式 https://my.oschina.net/u/154866/blog