Sweep

016. 垃圾回收机制

前提是你 提交于 2020-07-28 13:25:46
1. 自动垃圾收集 自动垃圾收集是查看堆内存,识别正在使用哪些对象以及哪些对象未被使用以及删除未使用对象的过程。 使用中的对象或引用的对象意味着程序的某些部分仍然维护指向该对象的指针。 程序的任何部分都不再使用的对象或未引用的对象,可以回收未引用对象使用的内存。 2. 如何确定内存需要被回收 该过程的第一步称为标记。这是垃圾收集器识别哪些内存正在使用而哪些不再使用的地方。 不同类型内存的判断方式 对象回收-引用计数 对象回收-可达性分析 方法区回收 可达性分析算法 简单来说,将对象及其引用关系看作一个图,选定活动的对象作为 GC Roots; 然后跟踪引用链条,如果一个对象和 GC Roots 之间不可达,也就是不存在引用,那么即可认为是可回收对象。 引用类型和可达性级别 引用类型 强引用(StrongReference):最常见的普通对象引用,只要还有一个强引用指向一个对象,就不会回收。 软引用(SoftReference):JVM 认为内存不足时,才会去试图回收软引用指向的对象(缓存场景)。 弱引用(WeakReference):虽然是引用,但随时可能被回收掉。 虚引用(PhantomReference):不能通过它访问对象。用于对象被 finalize 以后,执行指定逻辑的机制(Cleaner)。 可达性级别 强可达(Strongly Reachable)

jvm~xmx设置多少合适

∥☆過路亽.° 提交于 2020-07-28 13:11:20
Java整个堆大小设置 Xmx 和 Xms设置为老年代存活对象的3-4倍,即FullGC之后的老年代内存占用的3-4倍 永久代PermSize和MaxPermSize设置为老年代存活对象的1.2-1.5倍。 永久区并不是老年代的1.2到1.5倍,而是FullGC后永久区的1.2到1.5倍 1.2x to 1.5x permanent generation space 年轻代Xmn的设置为老年代存活对象的1-1.5倍。 老年代的内存大小设置为老年代存活对象的2-3倍。 查看进行的堆内存 jmap -head PID 1、Sun官方建议年轻代的大小为整个堆的3/8左右, 所以按照上述设置的方式,基本符合Sun的建议。 2、堆大小=年轻代大小+年老代大小, 即xmx=xmn+老年代大小 。 Permsize不影响堆大小。 3、为什么要按照上面的来进行设置呢? 没有具体的说明,但应该是根据多种调优之后得出的一个结论。 触发fullGc,查看老年代对象大小 使用jmap工具可触发FullGC jmap -dump:live,format=b,file=heap.bin <pid> 将当前的存活对象dump到文件,此时会触发FullGC jmap -histo:live <pid> 打印每个class的实例数目,内存占用,类全名信息.live子参数加上后,只统计活的对象数量.

HFSS天线仿真

亡梦爱人 提交于 2020-07-28 10:54:47
最近需要做一个天线仿真,搜了一下,找了些教程学习。下面以HFSS中设计一个RFID标签天线为例,记录一下设计仿真优化的全过程。 HFSS的安装就不多说了,网上很多,这里用的是HFSS15。RFID是射频识别卡,身份证公交卡高速EPC等非接触式身份识别通常用的都是这个技术。天线对RFID设备起到关键作用,简单起见,下面给出一个1GHz RFID标签的天线设计。注意所有操作仅为示意性的,并不是真正意义上的天线结构设计。 天线设计 打开HFSS软件,可看到左侧临时工程文件,点击右键将名称改为RFID。 选择File-Save As将工程另存到指定目录下,然后在工程中插入HFSS设计,如下所示。 HFSS常用快捷键如下: 按住Alt键旋转模型 按住Alt并双击坐标轴,模型切换至该轴垂直面 按住Shift键移动模型 按住Alt+Shift键放大缩小模型 按住Ctrl+D将模型居中 点击立方体模型图标,在下面的坐标系中点击鼠标左键,通过移动鼠标和点击左键,给出立方体长宽高。 右键点击模型框内的立方体Box1,选择Properties,设置立方体透明度为0.8。 在模型框内选择Box1下的CreateBox,右键选择属性,设置立方体长宽高。 完成后Ctrl+D让图像居中,如下图所示。 按住Alt双击z轴,切换到xy平面,点击平面矩形图标,画一个矩形如下图所示。 设置透明度和尺寸如下。

深度探索JFR

偶尔善良 提交于 2020-07-27 13:53:21
本文基于 OpenJDK 11 3. 虚拟机相关 Event 3.3. JIT即时编译相关 JIT 即时编译可能会遇到编译后的代码缓存占满,或者因为空间有限或者代码设计问题,导致某些关键方法需要重编译导致性能问题,以及因为代码块过大导致编译失败从而性能有问题,这些问题我们可以通过 JFR 中相关的 Event 进行查询。 JFR 对于 Java 开发可以完全替换 JVM 编译日志 。 额外讲解:JIT 相关的知识 首先,这里简单介绍下 JIT 相关的知识(这里我推荐看 O'Rerilly 上面的 Java Performance 第二版的第四章: Working with the JIT Compiler ): 首先什么是 JIT: 当 Java 被编译为字节码形式的 class 文件之后,他可以在任意的 JVM 运行。这里说的编译,主要是指 前端编译器 。但是 class 文件里面的字节码并不能直接运行,而是要通过 后端编译器 在程序运行期间,将字节码转变成机器码,这样电脑才能执行你的代码。 Java Code Cache 是啥: 如果 Java 每次都需要即时编译成机器码,再执行,效率太慢了。那么是不是对于某些热点代码,编译后的机器码,缓存起来,这样下次就不用重新即时编译了,多快乐。Java Code Cache 就是用来干这个的。但是编译后的机器码太大了,Java Code

jvm入门及理解(六)——垃圾回收与算法

别说谁变了你拦得住时间么 提交于 2020-07-27 03:21:38
一、jvm垃圾回收要做的事情 哪些内存需要回收 什么时候回收 怎么回收 二、如何判断对象已经死亡,或者说确定为垃圾 引用计数法: 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器的值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。这也就是需要回收的对象,简单地说,即一个对象如果没有任何与之关联的引用,即他们的引用计数都为 0,则说明对象不太可能再被用到,那么这个对象就是可回收的对象。 引用计数法是对象记录自己被多少 程序 引用,引用计数为零的对象将被清除。 计数器表示的是有多少程序引用了这个对象(被引用数)。计数器是无符号的整数。 根搜索算法:     通过一系列成为GC roots的点作为起点,向下搜索,当一个对象到任何GC Roots时没有引用链相连,则说明对象已经死亡。     如果在GC roots和一个对象之间没有可达路径(引用链),则称该对象是不可达的。要注意的是,不可达对象不等价于可回收对象,不可达对象变为可回收对象至少要经过两次标记 过程。两次标记后仍然是可回收对象,则将面临回收。     jvm会将以下的对象定义为GC Roots: Java虚拟机栈中引用的对象:比如方法里面定义这种局部变量 User user= new User(); 方法区中的静态属性引用的对象:比如 private static User

面试官:你对JVM垃圾收集器了解吗?13连问你是否抗的住!

≡放荡痞女 提交于 2020-07-24 18:30:57
关于JVM垃圾收集器的面试题 1、简述Java垃圾回收机制 2、GC是什么?为什么要GC 3、垃圾回收的优点和原理。并考虑2种回收机制 4、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收? 5、Java 中都有哪些引用类型? 6、怎么判断对象是否可以被回收? 7、在Java中,对象什么时候可以被垃圾回收 8、JVM中的永久代中会发生垃圾回收吗 9、说一下 JVM 有哪些垃圾回收算法? 10、说一下 JVM 有哪些垃圾回收器? 11、详细介绍一下 CMS 垃圾回收器? 12、新生代垃圾回收器和老年代垃圾回收器都有哪些?有什么区别? 13、简述分代垃圾回收器是怎么工作的? 1、简述Java垃圾回收机制 在java中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。在JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫面那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。 2、GC是什么?为什么要GC GC 是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存 回收会导致程序或系统的不稳定甚至崩溃,Java 提供的 GC 功能可以自动监测对象是否超过作用域从而达到自动

java堆内存又溢出了,教你一招必杀技

妖精的绣舞 提交于 2020-05-07 18:41:09
JAVA堆内存管理是影响性能主要因素之一。 堆内存溢出是JAVA项目非常常见的故障,在解决该问题之前,必须先了解下JAVA堆内存是怎么工作的。 先看下JAVA堆内存是如何划分的,如图: JVM内存划分为堆内存和非堆内存,堆内存分为年轻代(Young Generation)、老年代(Old Generation),非堆内存就一个永久代(Permanent Generation)。 年轻代又分为Eden和Survivor区。Survivor区由FromSpace和ToSpace组成。Eden区占大容量,Survivor两个区占小容量,默认比例是8:1:1。 堆内存用途:存放的是对象,垃圾收集器就是收集这些对象,然后根据GC算法回收。 非堆内存用途:永久代,也称为方法区,存储程序运行时长期存活的对象,比如类的元数据、方法、常量、属性等。 在JDK1.8版本废弃了永久代,替代的是元空间(MetaSpace),元空间与永久代上类似,都是方法区的实现,他们最大区别是:元空间并不在JVM中,而是使用本地内存。 元空间有注意有两个参数: MetaspaceSize :初始化元空间大小,控制发生GC阈值 MaxMetaspaceSize : 限制元空间大小上限,防止异常占用过多物理内存 为什么移除永久代? 移除永久代原因:为融合HotSpot JVM与JRockit VM(新JVM技术)而做出的改变

JVM GC VS .Net GC

ぐ巨炮叔叔 提交于 2020-05-07 12:57:15
Net平台GC VS JVM垃圾回收 前言 不知道你平时是否关注程序内存使用情况,我是关注的比较少,正好借着优化本地一个程序的空对比了一下.Net平台垃圾回收和jvm垃圾回收,顺便用dotMemory看了程序运行后的内存快照,生成内存快照后,妈妈再也不担心我优化程序找不到方向了。 .Net平台垃圾回收 内存优化 凭空想象这些概念多少会索然无味,下图是我我基于本地的一个程序生成的内存快照,使用jetbrains推出的 dotMemory 工具生成。 生成内存快照 程序运行时可以通过右上角的Get SnapShot按钮生成内存快照,内存快照里可以看到具体的对象、消耗内存的情况,比如说一些大的字符串对象,重复的大量的字符串对象, 那么从上面这张图上都能看到哪些关键字呢? 什么是Heap generation1和Heap greneration2呢? 什么是Allocated呢? 什么是GC GC (Garbage Collection)如其名,就是垃圾收集,当然这里仅就内存而言。Garbage Collector(垃圾收集器,在不至于混淆的情况下也成为GC)以应用程序的root为基础,遍历应用程序在 托管堆(Managed Heap) 上动态分配的所有对象,通过识别它们是否被引用来确定哪些对象是已经死亡的、哪些仍需要被使用

20155328 网络攻防 实验五:MSF基础应用

与世无争的帅哥 提交于 2020-05-06 02:52:45
#20155328 网络攻防 实验五:MSF基础应用 ###实践内容及过程记录 一、Windows服务渗透攻击————ms08_067 攻击机:kali 靶机:WindowsXP(英文版) 第一步,分别查看攻击机和靶机的IP。 在kali终端中,输入 msfconsole 进入msf控制台,依次输入以下指令: use exploit/windows/smb/ms08_067_netapiuse exploit/windows/smb/ms08_067_netapi show payloads set payload generic/shell_reverse_tcp set LHOST 192.168.127.138 set LPORT 5328 set RHOST 192.168.127.139 set target 0 exploit 攻击成功,可以看到已经获取了靶机的系统信息: 二、浏览器渗透攻击————ms11_103 在kali终端输入msfconsole打开msf控制台,输入以下参数: 被攻击的主机可以看到网页无法正常打开: 回到kali,输入以下指令: sessions sessions -i n//n为显示的最大进程号 可以看到攻击成功了。 三、针对Adobe Reader的渗透攻击 在kali中进入msf控制台,输入以下指令: use windows

LOAM_velodyne学习(一)

时光总嘲笑我的痴心妄想 提交于 2020-05-05 18:39:12
在研读了论文及开源代码后,对LOAM的一些理解做一个整理。 文章:Low-drift and real-time lidar odometry and mapping 开源代码:https://github.com/daobilige-su/loam_velodyne 系统概述 LOAM的整体思想就是将复杂的SLAM问题分为:1. 高频的运动估计; 2. 低频的环境建图。 ​ Lidar接收数据,首先进行Point Cloud Registration,Lidar Odometry以10Hz的频率进行运动估计和坐标转换,Lidar Mapping以1Hz的频率构建三维地图,Transform Integration完成位姿的优化。这样并行的结构保证了系统的实时性。 接下来是代码的框架图: ​ 整个算法分为四个模块,相对于其它直接匹配两个点云的算法,LOAM是通过提取特征点进行匹配之后计算坐标变换。具体流程为:ScanRegistration 提取特征点并排除瑕点;LaserOdometry从特征点中估计运动,然后整合数据发送给LaserMapping;LaserMapping输出的laser_cloud_surround为地图;TransformMaintenance订阅LaserOdometry与LaserMapping发布的Odometry消息,对位姿进行融合优化