Mark

《深入理解JVM.2nd》笔记(三):垃圾收集器与垃圾回收策略

落花浮王杯 提交于 2020-08-15 07:19:08
概述 1960年诞生于MIT的Lisp是 第一门 真正使用 内存动态分配 和 垃圾收集技术 的语言。 当Lisp还在胚胎期,人们就在思考GC需要完成3件事情: 哪些内存需要回收? 什么时候回收? 如何回收? 经过多年发展,垃圾收集器与内存分配技术日臻完善, 为什么还有去了解GC和内存分配 ? 因为当需要排查各种内存溢出、内存泄露问题时,当垃圾收集称为系统达到 更高并发量的瓶颈 时,就需要对这些“自动化”的技术实施必要的 监控 和 调节 。 在Java内存运行时区域中, PCR、 VM Stack、 Native Method Stack 3个区域与线程同生共死 。 栈中的栈帧随着方法的进入和退出而有条不紊地执行者出栈和入栈的操作。每一栈帧中分配多少内存基本上是在类结构确定下俩就已知的。 因此这几个区域内存分配和回收都具备确定性,所以无需多虑, 内存随着方法结束或者线程结束而回收 。 Java堆 和 方法区与这3区域的不同。 一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样,这能在程序运行期间才能知道会创建哪些对象,这部分内存分配和回收都是动态。 GC所关注的是这部分内存。 对象已死吗 GC在堆进行回收前,第一件事就是要哪些对象是“活”的,哪些是“死”的。 引用计数算法 引用计数算法 Reference Counting 思路:给对象中添加一个

JVM系列(2)-GC

可紊 提交于 2020-08-15 04:43:20
1.什么是GC? 大白话说就是垃圾回收机制,内存空间是有限的,你创建的每个对象和变量都会占据内存,gc做的就是对象清除将内存释放出来,这就是GC要做的事。 2.需要GC的区域 说起垃圾回收的场所,了解过JVM(Java Virtual Machine Model)内存模型的朋友应该会很清楚,堆是Java虚拟机进行垃圾回收的主要场所,其次要场所是方法区。 3.堆内存的结构 Java将堆内存分为3大部分:新生代、老年代和永久代,其中新生代又进一步划分为Eden、S0、S1(Survivor)三个区 4.堆内存上对象的分配与回收: 我们创建的对象会优先在 Eden分配,如果是大对象(很长的字符串数组)则可以直接进入老年代。虚拟机提供一个 -XX:PretenureSizeThreadhold参数 ,令大于这个参数值的对象直接在老年代中分配,避免在 Eden区和两个Survivor区发生大量的内存拷贝。 另外, 长期存活的对象将进入老年代 ,每一次 MinorGC(年轻代GC) ,对象年龄就大一岁,默认 15岁晋升到老年代,通过 -XX:MaxTenuringThreshold设置晋升年龄。 堆内存上的对象回收也叫做垃圾回收,那么垃圾回收什么时候开始呢? 垃圾回收主要是完成 清理对象,整理内存 的工作。上面说到 GC经常发生的区域是堆区,堆区还可以细分为新生代、老年代

java内存结构笔记

只谈情不闲聊 提交于 2020-08-15 00:44:45
此篇仅作笔记,详情参考: https://my.oschina.net/uwith/blog/3110227 栈帧内部的结构:局部变量表、操作数栈(比如我们去赋值或者计算都会操作操作数栈)、动态链接、返回链接。 jvm为对象开辟空间的两种方式: 1、指针碰撞:如果内存空间是规整的有序的连续空间、每存放进去一个对象,对应的指针会向后移动一位。如果是多线程会使用cas锁(是在硬件cpu层面进行加锁)。 2、空闲列表:也就是内存空间不是连续的,会有一个列表指示那些空间是空闲的。 栈上分配:如果在方法中new出来一个对象,对象较小,且只有该方法使用,那么这个new出来的对象就会分配在栈上,而不是堆上。涉及到内存逃逸可以参看下面的链接: https://www.jianshu.com/p/7418a4451974 垃圾回收机制如何判断存活?:引用计数法、可达性算法(根搜索算法)。引用计数发解决不了循环依赖,导致垃圾无法回收。 可达性算法可以作为GCRoots的对象包括:虚拟机栈、方法区中类的静态属性引用对象、方法区中常量引用的对象、本地方法栈中的JNI 垃圾回收机制策略: 1、标记清除算法:碎片化严重。常用在老年代。 2、 标记复制算法 :能够解决碎片化问题但浪费空间。常用在新生代。 3、标记整理算法:也就标记压缩算法,会将标记的对象放在一块,进行挪动,保证空间连续性,解决磁盘碎片问题

Unity可编程渲染管线系列(十二)图像质量(MSAA和HDR)

蹲街弑〆低调 提交于 2020-08-14 20:09:58
目录 1 渲染比例 1.1 向下缩放 1.2 渲染到缩放后的纹理 1.3 向上缩放 2 MSAA 2.1 配置 2.2 多采样渲染纹理 2.3 解析纹理贴图 2.4 无深度解析 2.5 Depth-Only 通道 3 HDR 3.1 配置 3.2 纹理格式 3.3 色调映射 3.4 莱因哈德(Reinhard) 3.5 修改Reinhard 本文重点: 1、调整渲染比例 2、支持MSAA 3、启用HDR,带有可选的色调映射 这是涵盖Unity的可脚本化渲染管道的教程系列的第12部分。它涉及通过调整渲染比例,应用MSAA以及与色调映射结合使用HDR缓冲区进行渲染来提高图像质量。 本教程是CatLikeCoding系列的一部分,原文地址见文章底部。“原创”标识意为原创翻译而非原创教程。 本教程使用Unity 2018.4.6f1制作。 (HDR,MSAA和渲染比例一起使用) 1 渲染比例 要渲染的图像的宽度和高度由相机确定,这不受管道的控制。但是我们可以在渲染到摄像机目标之前做任何我们想做的事情。如果渲染为中间的纹理,可以提供我们想要的任何大小。例如,我们可以将所有内容渲染为较小的纹理,然后对相机目标进行最后的blit处理以将其缩放到所需大小。这会降低图像质量,但由于要处理的片段较少,因此加快了渲染速度。Lightweight/Universal管道具有“Render Scale

Java 类加载出现死锁? 转

半腔热情 提交于 2020-08-14 18:01:22
出处: Java 类加载还会死锁?这是什么情况? 一、前言 先贴一份测试代码,大家可以先猜测一下,执行结果会是怎样的: import java.util.concurrent.TimeUnit; public class TestClassLoading { public static class A{ static { System.out.println( "class A init" ); try { TimeUnit.SECONDS.sleep( 1 ); } catch (InterruptedException e) { e.printStackTrace(); } new B(); } public static void test() { System.out.println( "aaa" ); } } public static class B{ static { System.out.println( "class B init" ); new A(); } public static void test() { System.out.println( "bbb" ); } } public static void main(String[] args) { new Thread(() -> A.test()).start(); new Thread(() ->

深入探究JVM之垃圾回收器

心已入冬 提交于 2020-08-14 11:43:19
@ 目录 前言 正文 一、垃圾收集算法 标记-复制 标记-清除 标记-整理 分代回收 二、常用的垃圾回收器 Serial/SerialOld ParNew Parallel Scavenge/ParallelOld CMS Garbage First 总结 前言 JVM的自动内存管理得益于不断发展的垃圾回收器,从最初的单线程收集到现在并发收集,垃圾回收器的开发者们一直在致力于如何降低GC过程中的停顿时间(STW)以及提高吞吐量,但直到现在也不存在一款完美的垃圾回收器,只能根据不同的场景选择最合适的。所以需要了解每款垃圾回收器出现的背景、原因,并掌握各种垃圾回收器的设计原理、算法实现细节以及各个垃圾回收器的优劣对比,这样才能让我们在调优时做出最合适的选择。这部分内容博主准备分为两篇文章进行总结讲解,本篇主要是对 垃圾收集算法的思想 以及目前 稳定商用 的垃圾回收器的讲解。 正文 一、垃圾收集算法 上文分析了JVM判断对象存活的两种算法: 引用计数 和 可达性分析 。因此垃圾收集算法的实现也对应的分为 引用计数式收集 和 追踪式收集 ,而目前JVM中都没有使用 引用计数 算法,所以后面讲解的算法都属于追踪式收集。其细分又分为 标记-复制 、 标记-清除 、 标记-整理 、 分代回收 。 标记-复制 复制算法 最初的理论是 将可用内存分为1:1的两块,每次只使用其中一块,当这块内存满后

MongoDB文档(二)--查询

萝らか妹 提交于 2020-08-14 11:01:29
(一)查询文档 查询文档可以使用以下方法 # 以非结构化的方式显示所有的文档 db. < collectionName > .find(document) # 以结构化的方式显示所有文档 db. < collectionName > .find(document).pretty() # 只返回一个文档(结构化方式) db. < collectionName > .findOne() 测试1 : 使用find()方法以非结构化的方式查询文档 > db.blog.find() { "_id" : ObjectId("5ebd7133c50e24a9d8fb2a7a"), "title" : "Linux 物理卷(PV)、逻辑卷(LV)、卷组(VG)管理", "Link" : "https://www.cnblogs.com/lijiaman/p/12885649.html", "summary" : "(一)相关概念逻辑卷是使用逻辑卷组管理(Logic Volume Manager)创建出来的设备,如果要了解逻辑卷,那么首先...", "tags" : [ "Linux", "study" ], "post" : "2020-05-13 23:17", "views" : 57, "comments" : [ { "user" : "user1", "message" : "mark!

synchronized 原理知多少

走远了吗. 提交于 2020-08-14 08:59:18
synchronized 是 Java 编程中的一个重要的关键字,也是多线程编程中不可或缺的一员。本文就对它的使用和锁的一些重要概念进行分析。 使用及原理 synchronized 是一个重量级锁,它主要实现同步操作,在 Java 对象锁中有三种使用方式: 普通方法中使用,锁是当前实例对象。 静态方法中使用,锁是当前类的对象。 代码块中使用,锁是代码代码块中配置的对象。 使用 在代码中使用方法分别如下: 普通方法使用: /** * 公众号:ytao * 博客:https://ytao.top */ public class SynchronizedMethodDemo{ public synchronized void demo(){ // ...... } } 静态方法使用: /** * 公众号:ytao * 博客:https://ytao.top */ public class SynchronizedMethodDemo{ public synchronized static void staticDemo(){ // ...... } } 代码块中使用: /** * 公众号:ytao * 博客:https://ytao.top */ public class SynchronizedDemo{ public void demo(){ synchronized

小白也能看懂的锁升级过程和锁状态

自古美人都是妖i 提交于 2020-08-14 08:50:22
一、前言 锁的状态总共有四种,级别由低到高依次为:无锁、偏向锁、轻量级锁、重量级锁,这四种锁状态分别代表什么,为什么会有锁升级?其实在 JDK 1.6之前,synchronized 还是一个重量级锁,是一个效率比较低下的锁,但是在JDK 1.6后,Jvm为了提高锁的获取与释放效率对(synchronized )进行了优化,引入了 偏向锁 和 轻量级锁 ,从此以后锁的状态就有了四种(无锁、偏向锁、轻量级锁、重量级锁),并且四种状态会随着竞争的情况逐渐升级,而且是不可逆的过程,即不可降级,也就是说只能进行锁升级(从低级别到高级别),不能锁降级(高级别到低级别),意味着偏向锁升级成轻量级锁后不能降级成偏向锁。这种锁升级却不能降级的策略,目的是为了提高获得锁和释放锁的效率。 二、锁的四种状态 在 synchronized 最初的实现方式是 “阻塞或唤醒一个Java线程需要操作系统切换CPU状态来完成,这种状态切换需要耗费处理器时间,如果同步代码块中内容过于简单,这种切换的时间可能比用户代码执行的时间还长”,这种方式就是 synchronized实现同步最初的方式,这也是当初开发者诟病的地方,这也是在JDK6以前 synchronized效率低下的原因,JDK6中为了减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级锁”。 所以目前锁状态一种有四种,从级别由低到高依次是:无锁

Andersen Global进军智利,新增两家合作公司

吃可爱长大的小学妹 提交于 2020-08-14 07:20:04
旧金山--(美国商业资讯)--Andersen Global通过与两家圣地亚哥公司——律师事务所Chirgwin Peñafiel和税务公司SPASA Consulting的合作协议进军智利市场。两家公司彼此密切合作,并在Andersen Global的拉丁美洲平台不断稳定扩张的过程中增加了该平台的深度和广度。 Chirgwin Peñafiel成立于2009年,由办公室管理合伙人Andrés Chirgwin领导,是一家提供全方位服务的律师事务所,专门从事商业与公司法、并购、能源、劳动法以及银行与金融业务。该事务所与各种公司客户合作,致力于为在智利开展业务的跨国公司提供法律支持,同时也为有本地与国际法律需要的智利公司提供协助。Chirgwin Peñafiel已获得 IFLR1000 、 Leaders League 和 Best Lawyers 的认可。 Andrés 表示:“我们事务所致力于为我们的本地与国际客户提供优质全面的解决方案。Andersen Global的能力将使我们能够在全球范围内提供无缝、一流的解决方案。我们期待与处理客户事务时重视独立性和透明度的志同道合的个人合作。” 20多年来,SPASA Consulting一直提供全面的咨询服务,重点是税务咨询、会计服务和薪资合规。该公司的专业知识还包括对IFRS和应税规则的深入了解和理解