自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(16)
  • 收藏
  • 关注

原创 G1 调优策略

一般情况下设置为100ms到200ms都是可以的,不同情况下会不一样,但是如果设置成50ms就不太合理,因为暂停时间设置的太短,就会导致G1跟不上垃圾产生的速度,最终退化为FULL GC,所以对这个参数的调优是一个持续的过程,逐步调整到最佳状态,暂停时间只是一个目标,并不是总能得到满足的;因为G1收集器在运行过程中会自己调整新生代和老年代的大小,其实是通过adapt代的大小调整对象晋升的速度和年龄,从而达到收集器设置的暂停时间目标,如果手动设置就意味着放弃了G1的自动调优;4.MixedGC调优。

2023-03-23 11:18:51 619 1

原创 JVM常用命令

3.修改 这个是只有被标记为manageable的flags可以被修改。jinfo 1.查看和调整JVM配置参数。jinfo -flag 参数名 PID。查看所有参数 这个flag多了一个s。这边查看成功之后会输出非默认的参数。jps 查看java进程。jmap 打印堆内存快照。

2023-03-23 11:15:05 103

原创 如何判断是否使用G1垃圾收集器

官网的推荐语:G1是第一个重点是为运行需要大堆且GC延迟有限的应用程序的用户提供解决方案,这意味着大约6GB或者更大的堆大小,以及低于0.5秒的稳定且可预测的暂停时间。高吞吐量则可以高效的利用CPU的时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务;停顿时间越短就越适合需要和用户交互的程序,良好的响应速度能提升用户体验;吞吐量: 运行用户代码时间/(运行用户代码时间+垃圾收集时间)停顿时间:垃圾收集器在进行垃圾回收终端应用执行响应的时间。3.垃圾回收时间比较长 超过0.5或者1秒。

2023-03-23 11:14:27 150

原创 生产环境中如何选择合适的垃圾收集器

3.如果是单核,并且没有停顿时间的要求,使用串行或JVM自己选择 Parallel系列。1.优先调整堆的大小让服务器自己来选择 Serial系列。2.如果内存小于100M使用串行收集器 Serial系列。5.如果响应时间最重要,并且不能超过一秒,使用并发收集器。4.如果允许停顿时间超过一秒,选择并行或JVM自己选择。

2023-03-23 11:13:39 102

原创 Java对象被判定为不可达对象之后就死了吗

对象在不可达阶段之后会进入到收集阶段,查看这个对象有没有必要执行finalize方法,如果没有必要的话,也就是说没有重写finalize方法,虚拟机已经调用过finalize方法,那就进入终结阶段,如果有必要,也就是重写了finalize方法,会进入F-queue,虚拟机会自动创建一个低优先级的线程,并finalize执行对象的finalize方法,然后在执行这个方法的时候如果没有重新被跟对象建立连接,那就会进入终结阶段,如果重新建立了连接,对象就会从F-queue中移除,并且对象重新进入应用阶段。

2023-03-23 11:13:16 88

原创 JVM垃圾收集算法

并发收集器:CMS G1 ZGC停顿时间优先 用户线程和垃圾收集器线程同时执行,但并不是一定是并行的,可能是交替执行的,垃圾收集器在执行的时候不会停顿用户线程的执行。将内存划分为两块相等的区域,每次只使用其中的一块,当其中一块内存使用完了,就将还存活的对象复制到另外一块内存上面,然后把已经使用过的内存空间一次清楚掉。Young区:复制算法,对象在被分配之后,可能生命周期比较短,所以复制效率比较高。Old区:标记清除或者标记整理算法,old区存活时间比较长。2.清除 清除掉需要回收的对象,释放出对应的空间。

2023-03-23 11:13:05 42

原创 JVM什么时候会进行垃圾回收

GC是由JVM自动完成的,根据JVM系统环境而定,所以机制是不确定的,当然我们也可以手动进行垃圾回收,比如调用System.gc()方法通知JVM进行垃圾回收,但是具体什么时候运行也是无法控制的,也就是说我们调用了System.gc()只是通知JVM要去回收,但是什么时候回收是由JVM决定的,但是不建议手动调用该方法,因为GC消耗的资源比较大。4.System.gc() 执行的是Full GC的操作。1.当Eden区或者S区不够用了。2.老年代空间不够用了。3.方法区空间不够用了。

2023-03-23 11:12:02 587

原创 可达性分析算法/根搜素算法

能作为GC root的对象:类加载器,Thread,虚拟机本地变了表,static成员,常量引用,本地方法栈的变量等;对某个对象而言,只要应用程序中持有该对象的引用,就说明该对象不是垃圾,如果一个对象没有任何指针对其引用,它就是垃圾,通过GC Root的对象,开始向下寻找,看某个对象是否可达。缺点,如果AB两个对象互相持有,就会导致永远不会被回收。当对象过大的时候,超过阈值的时候会直接进入老年代担保。要想进行垃圾回收,得先知道什么样的对象是垃圾。

2023-03-23 11:11:58 40

原创 JVM中的类加载问题

进行数据流和控制流分析,确定程序语义是合法的,符合逻辑的,对类的方法进行校验分析保证被校验的类的方法在运行时不会做出危害虚拟机安全的行为,获取类的二进制字节流的节点是我们Java程序员最关注的阶段,也是操控性最强的阶段,因为这个阶段我们可以对我们的类加载器进行操作,比如我们想自定义类加载器进行操作用以完成加载,又或者我们想通过JAVA Agent来完成我们的字节码增强操作;2.SPI机制 Service Provider Interface。

2023-03-23 11:11:11 111

原创 JVM- 运行时数据区

与程序计数器一样都是线程私有的,生命周期与线程相同,虚拟机栈描述的是Java方法执行的内存模型,每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量、操作栈、动态连接、方法出口等信息,每一个方法被调用直至被完成的过程,就对应着一个栈帧在虚拟机栈从入栈到出栈的过程;运行时常量池、字段、方法数据,以及方法和构造函数的代码,包括类的实例初始化和接口初始化中使用的特殊方法;如果方法区内存不够会抛出内存不足的异常;主要存放的是Native 方法,其实可以理解为调用C++的方法,线程私有的;

2023-03-23 11:05:58 43

原创 HashMap resize 扩容方法

扩容方法:判断当前容量是否大于最大容量,或者左移一位之后大于最大容量,或者是null的时候,对当前HashMap进行扩容第一次进来的时候会对tab数组设置容量为16;阈值设置为0.75*16如果非空的时候,会对所有当前HashMap的所有数据都进行重新hash,设置索引,针对tab里面不通的数据(null,数组、一个Entry节点,红黑树)进行不同的处理,并放进扩容之后的HashMap中去。final Node<K,V>[] resize() {//获取当前HashMap

2021-08-30 15:40:00 149

原创 HashMap put 方法

最基础的put方法源码: 调用putVal()方法去存放数据,首先对key进行hash方法取得hash值,public V put(K key, V value) {return putVal(hash(key), key, value, false, true);}首先对当前HashMap进行判断,如果是空的话,进行扩容操作,因为HashMap初始化的时候并没有对tab进行初始化。源码:final V putVal(int hash, K key, V value, b

2021-08-30 15:39:19 246

原创 HashMap 基础信息

transient Node<K,V>[] table是一个entry数组,而entry是一个单项链表,哈希表对应的键值对都存储在entry数组里面,每一个entry对应一个哈希地址,这里的entry就是常说的桶transient Set<Map.Entry<K,V>> entrySet;transient int size;是hashmap的大小,是保存键值对的数量transient int modCount;用来实现快速失败机制的(fast

2021-08-30 15:37:52 75

原创 HashMap源码:构造函数

构造函数:public HashMap() {this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted}public HashMap(int initialCapacity) {this(initialCapacity, DEFAULT_LOAD_FACTOR);}public HashMap(int initialCapacity, float loadFactor) {if (init

2021-08-30 15:36:54 183

原创 HashMap get方法

get方法拿到key之后调用hashMap的get方法,get方法内部会去定义一个Node节点,之后会调用getNode方法去获取value值首先去hash这个key,然后再调用getNode方法的时候会优先去比较第一个节点的数据,如果hash值是一致的话,就返回node节点的value,如果头结点与key的hash之后不相同,那就根据当前的Node节点去分别调用不同的方法,如果是正常的链表,就去调用后一个去依次比较,如果是红黑树,就去红黑树去查询对应的子节点的value.源码public V

2021-08-30 15:35:45 1992

原创 记一次try catch的使用场景

1.首先为什么使用try catch 2.类似于文件IO流的操作一般来说是必须使用try catch的 3.当不确定当前写的代码会不会出现问题,又不想影响整体的业务逻辑,导致提前抛出异常,得到我们不想得到的结果 例如:List<BmOrderDTO> orderList = new ArrayList();JSONObject fahuoyiOrder = null; for (int i = 0; i &lt...

2021-07-02 16:26:26 360

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除