- 博客(13)
- 收藏
- 关注
原创 [JVM] G1回收器(二)
G1回收器(二)时间停顿模型:能够在一个指定长度为M毫秒的时间段内,消耗在垃圾收集上的时间大概率不超过N毫秒该模型就是G1回收器需要实现的目标在G1之前,所有的垃圾回收器的回收目标都是一整个分代,如整个新生代,整个老年代,或者整个Java堆,G1则不同,它不再面向单个分代来进行垃圾回收,而是使用回收集(Collection Set),回收集的组成可以是任意的堆内存,衡量回收集的标准是,哪块内存存放垃圾最多,回收收益最大,这个就是G1独有的Mixed GC模式G1中同样存在新生代、老年代的划分,但是G
2020-07-10 12:13:38 198
翻译 [JVM] GC日志中的Metaspace
GC日志中的Metaspace和class space参考文章: java面试:你真的知道metaspace??参考文章: 理解JVM堆中Metaspace的输出在GC日志中,有这么一段 Metaspace used 2652K, capacity 4486K, committed 4864K, reserved 1056768K class space used 286K, capacity 386K, committed 512K, reserved 1048576K
2020-06-10 07:04:35 1209
原创 [JVM] G1回收器介绍
G1回收器在使用ParNew + CMS进行垃圾回收时,会导致长时间的STW,而STW的本质就是停止系统的工作线程,让系统无法对外服务,同时让GC线程进行垃圾回收的。如果回收时间较长,那么会给系统性能带来较大的影响因此G1回收器出现了,它的特点有将Java堆分为多个大小相等的Region每个Region都有可能属于新生代或老年代可以设置垃圾回收的预期停顿时间,比如在一小时内最多停顿一分钟G1如何做到设置垃圾回收的预停顿时间G1会追踪每个Region中的回收价值(当前Region
2020-06-09 07:25:17 253
原创 [JVM] 老年代的垃圾回收
老年代的垃圾回收什么情况下对象会进入到老年代在JVM中,每个对象都有一个GC年龄,当发生GC时,如果对象没有被回收,那么它的GC年龄就+1默认情况下,GC年龄超过15的对象会进入老年代,如果想自定义这个年龄可以通过JVM参数-XX:MaxTenuringThreshold来设置动态年龄判断,如果在Survivor区域中,有一半以上的同年龄对象占用的内存超过50%,那么所有年龄大于等于该年龄的对象都会进入老年代大对象直接进入老年代,通过JVM参数-XX:PretenureSizeThreshold
2020-06-02 22:06:20 2302
原创 动态代理(简介)
动态代理动态代理类似于设计模式中的代理模式,在Java中的体现就是,给目标类生成一个代理类,用代理类来调用目标类的具体方法,并可以在调用前后给目标方法执行一些附加功能,最简单的应用就是Spring中的Aop,使用@Transactional注解可以在不写事务相关代码的情况下给方法增加事务动态代理的实现方式有两种实现方式,JDK动态代理,即Java语言提供的动态代理实现CGLIB动态代理,第三方库实现的动态代理JDK动态代理JDK动态代理的实现需要目标类必须实现了某个接口,然后才能够给目标类
2020-05-31 10:16:10 152
原创 深入理解Java虚拟机(学习笔记) - Day2 - 垃圾收集
常见的垃圾收集算法标记-清除算法(Mark-Sweep)首先标记出需要回收的所有对象然后在标记完成后统一回收所有被标记的对象使用该算法进行垃圾收集会产生以下问题:效率较低会产生大量内存碎片复制算法(Copying)将可用内存的容量划分为两块相等的小块每次只使用其中一块,当使用完之后就将还存活的对象复制到另一块未被使用过的内存块中,然后把已使用完毕的这块内存一次...
2018-12-15 16:37:47 1399 2
原创 深入理解Java虚拟机(学习笔记) - Day2 -如何知道对象是否死亡
如何判断对象是否已经死亡引用计数法给对象添加一个引用计数器,每当对象在一个地方被引用时,这个计数器的值就+1,当引用失效时,这个计数器的值就-1,当计数器的值为0时,表示这个对象在任何地方都没有被引用,即该对象已经死亡。由于很难解决对象之间的循环引用问题,所以该方法没有被应用在JVM中可达性分析通过一系列称为**“GC Roots”的对象作为起始点,从这些对象开始向下搜索,...
2018-12-14 15:35:00 122
原创 深入理解Java虚拟机(学习笔记) - Day2 - 对象
对象的创建类加载检查当遇到new指令时,首先会检查常量池中是否能定位到一个类的符号引用,并且检查这个类的符号引用代表的类是否已经被加载、解析和初始化过,如果没有,就必须先执行类加载过程为新生对象分配内存内存分配一般有两种方式,“指针碰撞(Bump The Pointer)”:假设Java堆中的内存都是规整的,所有用过的内存放在一边,没用过的内存放在另一边,中间放着作为分界点的指...
2018-12-14 15:32:18 94
原创 深入理解Java虚拟机(学习笔记) - Day1
JVM的种类Sun Classic VM:仅支持解释器执行Sun Exact VM:编译器和解释器混合工作以及两级即时编译器仅发布在Solaris平台Exact Memory Management 准确试内存管理Sun HotSpot VM:JIT热点代码编译,通过计数器找到经常执行的代码,直接编译为机器码KVM (KiloByte):运行与手机平台JRockit:专注于...
2018-12-14 15:30:29 128
原创 Java并发编程(一) - 线程安全(笔记)
线程安全 编写线程安全的代码,本质上就是对状态的访问,一般来说这些状态都是共享的、可变的。在编码时,一个对象的状态就是它的数据,存储在状态变量中。 共享,指的就是变量可以被多个线程访问。可变,指的是变量的值在生命周期内是可以被改变的。 对于线程安全,我们需要做的就是在不可控制的并发访问中保护数据。 无论何时,只要有多于一个的线程访问给定的状态变量,而且其中某个线程会写入该变量,此...
2018-09-23 12:00:23 102
原创 LeetCode - 617 :合并二叉树
合并二叉树给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。示例1: 输入: 输出: 注意: 合并必须从两个树的根节点开始。解题思路如果 Tree1 和...
2018-09-13 11:47:50 394
原创 数据结构与算法(二):线性表之数组
一、线性表的定义线性表 零个或多个元素的有限序列需要强调两点: 第一,线性表是一个序列,也就是说,元素之间是有顺序的 第二,线性表是有限的,即元素的个数是有限制的。当线性表中的元素个数(n = 0)时,线性表为空,称为空表二、线性表的基本操作// 初始化一个空的线性表void init(); // 获取线性表中元素的个数int getSize(); ...
2018-09-12 17:09:20 160
原创 数据结构与算法(一):起航
数据结构什么是数据结构?数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。 通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。一、数据结构的基本功能如何插入一条新的数据项如何寻找某一特定的数据项如何删除某一特定的数据项如何迭代的访问各个数据项,以便进行显示或其他操作也就是我们常说的增、删、改、查二、常见的数据...
2018-09-12 15:36:58 212
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人