![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java基础
文章平均质量分 68
前进人生
希望能和大家一起交流进步
展开
-
JVM阶段(6)-方法区回收
方法区的回收,看起来是存在一定争议的。JVM虚拟机规范中并没有要求虚拟机强制回收方法区。在书中,也讲解了,JDK11版本的ZGC,其实就不包含方法区回收的内容。因为,相对堆而言,方法区回收内容比较少。其实常见的回收只有运行时常量池回收以及类卸载。原创 2022-09-04 17:27:56 · 410 阅读 · 0 评论 -
JVM阶段(5)-引用系列
JVM虚拟机为什么要划分为四种引用类型,强引用(reference),软引用(soft reference),弱引用(weak reference),虚引用(phantom Reference)四种呢?在最开始jdk1.2的时候,java其实只有强引用的,即在reference中只包含了一块内存的起始地址,代表了它是某个对象,某个地址方面的引用。但是,有一些额外的场景,需要我们创建一些生存周期不是那么长的对象,就比如缓存吧。这个就不好满足了,所以划分了如下四种。原创 2022-09-04 17:10:36 · 530 阅读 · 0 评论 -
JVM阶段(4)-回收策略
回忆一下,运行时数据区哪些部分会产生OOM异常,如果无休止的创建对象,或者类信息,或者往运行时常量池塞数据,都可能导致OOM。为了避免这种情况,就需要去考虑底层的垃圾收集。那么,哪些内存需要回收。什么时候来回收。如何回收。这三个问题,其实就是垃圾回收器的本质。当然,先从哪些内存需要回收说起。其实主要就是堆和方法区,其它的都是线程私有,线程挂,直接无。原创 2022-09-02 15:31:50 · 292 阅读 · 0 评论 -
JVM阶段(3)-OutOfMemoryError异常
前两节的内容,说实在的,书上讲的比较宏观,接下来就是看看OOM,从细节上分析吧。第一节学的运行时数据区讲过了,可能出现OOM问题的区域。程序计数器是不可能出现的,堆是高发区,栈的话如果栈帧过大并且没有设置栈深度,可能会出现。方法区的话,也可能会出现,比如运行时常量池,还有类信息的加载。以及非运行时数据区直接内存影响堆。这些都是,接下来就细化代码写一下。...原创 2022-08-31 20:30:49 · 530 阅读 · 0 评论 -
JVM阶段(2)-对象
在读取对象创建的时候,我在创建过程中和类的加载过程感觉是息息相关的,好好捋一下。在JAVA代码中,我们创建普通对象只需要通过new来进行创建。在在虚拟机底层,却包含了许多东西。1.首先,在调用new关键字时,虚拟机此时会碰到一个new指令,首先通过这个new指令所带的参数去在常量池(.class的常量池)中去 寻找是否包含该类的符号引用,并且检查这个类的符号引用是否已经被类加载,解析和初始化。如果没有,则对当前的类执行类加载过程(加载)。2.类加载过程通过后,会给当前对象来进行内存的分配。...原创 2022-08-26 19:56:40 · 195 阅读 · 0 评论 -
JVM阶段(1)-运行时数据区
在C语言,C++两种语言中,创建对象时,也意味着我们需要手动销毁这个对象,也就是构造函数与析构函数。但在java中,开发却并没有涉及到关于对象销毁的这个操作。因为java底层封装了垃圾回收器,来保证对无用对象的回收。JVM中存在哪些内存区域,垃圾回收器又怎么回收,从什么地方开始回收,都是需要了解的,否则,出现问题,没法排查是个硬伤。先从底层结构开始了解。原创 2022-08-22 20:57:41 · 236 阅读 · 0 评论 -
HashMap源码解读
为了应付面试,所以就着HashMap看一下源码,网上的面试题,五花八门的太多了,感觉不太对劲,还是自己看看吧。构造方法其实就是给负载因子loadFactor以及扩容时元素个数threshold赋值,真正创建Node数据的操作,源自于put方法中的resize()方法。Put方法put方法,底层调了个putVal方法,第四个参数代表如果在hashMap中存在key相同的情况下,是否替换value,false代表替换,第五个参数在hashMap的put方法中用到的方法是个空方法体,先不用考虑。原创 2022-06-29 15:48:43 · 69 阅读 · 0 评论 -
线程学习(12)-锁膨胀
锁膨胀其实就是锁升级的过程,从偏离锁升级为轻量级锁,以及从轻量级锁升级成重量级锁的过程。这里以从轻量级锁升级成重量级锁的过程直接上代码吧。轻量级锁升级成重量级锁的过程过程。package com.bo.threadstudy.four;import lombok.extern.slf4j.Slf4j;import org.openjdk.jol.info.ClassLayout;import java.util.concurrent.locks.LockSupport;/** *原创 2022-05-26 18:46:25 · 671 阅读 · 0 评论 -
多线程提升性能方式理解(初步认知)
昨天在压测一个兄弟的python项目的时候,发现50个并发请求便将程序卡住了。当时也有点发迷,具体解决方案有什么。后面想到了多线程,但多线程是怎么提升效率的呢?首先,多线程提高的不是CPU执行效率,而是CPU资源利用率。试想一下,在我们执行程序时,CPU是一直占用的吗?答案当然是NO,在程序执行过程中,存在许多过程,CPU执行(小头),IO执行(大头),如果是单线程访问情况下,有一个请求CPU执行完成了,但是后续还有一堆IO操作,这时,CPU是空闲状态,资源空置了。而多线程情况下,在第一个线程不利用原创 2021-07-28 10:10:13 · 527 阅读 · 0 评论 -
projected访问修饰符误区
今天在检验垃圾回收方法时,想通过对象调用finalize方法来进行垃圾回收,却未找到当前方法,发现自己在基础方向尚有欠缺。finalize方法是被projected来修饰的,那么需要针对关键字来理解一下了。projected访问修饰符,它能在哪些地方调用呢?先创建一个学生类:package com.bo.pojo;import org.springframework.boot...原创 2019-03-31 12:14:58 · 410 阅读 · 0 评论 -
堆栈相关
和朋友闲聊,聊到了一个问题,方法如下 private String name = "zhangsan"; @Test public void test0(){ System.out.println(name); String name = "wangwu"; System.out.println(name); }能...原创 2019-03-21 22:01:35 · 183 阅读 · 0 评论