前言 Java 虚拟机是学习 Java 的基础,也是迈入高级 Java 开发工程师的必备知识点。所以今天这篇文章我们来聊聊如何从零开始学习 Java 虚拟机。 深入浅出Java虚拟机 对于刚刚接触 JVM 的同学来说,JVM 就像一个黑盒一样,完全不知道这是一个什么东西。所以对于小白来说,最重要是搞清楚 J
一、多任务概念 1、示例: import time import threading def sing(): for i in range(0,5): print("-----唱歌-----") time.sleep(1) def dance(): for i in range(0,5): print("-----跳舞-----") time.sleep(1) def main(
每一个程序员都拥有一座大厂梦,很多Java开发者面试之前,可能没有较长的工作时间或者较为丰富的工作经验,所以不知道互联网公司或者一线互联网公司技术面试都会问哪些问题? 再加上可能自己准备也不充分,去面试没几个回合就被面试官几个问题打蒙了,最后以惨败收场。 今天针对这类的Java工
1.线程并发一个程序内部能拥有多个线程并行执行。一个线程的执行可以被认为是一个CPU在执行该程序。当一个程序运行在多线程下,就好像有多个CPU在同时执行该程序。总之,多线程即可以这么理解:多线程是处理高并发的一种编程方法,即并发需要用多线程实现。 2.如何分配线程数量利用 CPU
JVM虚拟机 Volatile: 参考:https://mp.weixin.qq.com/s/Oa3tcfAFO9IgsbE22C5TEg 看下下面这段代码 public static void main(String[] args) { ThreadTest test = new ThreadTest(); test.start(); for (; ; ) { if (test.isFlag()) { Syste
JDK内置四种拒绝策略 AbortPolicy(默认):直接抛出 RejectedExecutionException 异常阻止系统正常运行 CallerRunsPolicy:“调用者运行”一种调节机制,该策略既不会抛弃任务,也不会抛出异常,而是将某些任务回退到调用者,从而降低新任务的流量 DiscardOldestPolicy:抛弃队列中等待最久的
一、设计初衷 数组查询效率高,增删效率低,链表反之,HashMap为了考虑查询、增删效率综合,考虑用数组,和链表,但由于链表长度过长,感性角度,影响美观,其次要查询最末节点值,需要遍历的链表节点很长很多,不能无限制的让加长,因此链表长度超过8时,jdk1.8后引入了红黑树 上图每个框框元素是什
## 一面(个人感觉回答得还不错)**1. 自我介绍****2. 说项目,项目问的非常深**(本人提到之前做过的一篇关于FULL GC的问题定位和优化的项目以及一个多并发的项目)> 2.1 对于自己产于过项目的系统定位是否清楚?> 2.2 对于系统的各个模块是否清楚?> 2.3 每个接口的tps?> 2.4 对
# 一面* 自我介绍* 项目中的监控:那个监控指标常见的有哪些?* 微服务涉及到的技术以及需要注意的问题有哪些?* 注册中心你了解了哪些?* consul 的可靠性你了解吗?* consul 的机制你有没有具体深入过?有没有和其他的注册中心对比过?* 项目用 Spring 比较多,有没有了解 Spring
# 1 JVM的内存区域布局* java代码的执行步骤有三点 * java源码文件->编译器->字节码文件 * 字节码文件->JVM->机器码 * 机器码->系统CPU执行* JVM执行的字节码需要用类加载来载入;字节码文件可以来自本地文件,可以在网络上获取,也可以实时生成。就是说你可以跳过
一、CPU角度的并发与并行 并发 曾经我作为一个不是很爱学习的孩子,在上学的时候经常做这样的事情:在数学课上补物理作业,数学课听懂了,物理作业也上交了。不谦虚的说,我是具备这样的能力,但很可惜没用对地方。 很多同学说:“你是不是有多个大脑?”,肯定不是啊,其实这是一种切换的能力。
图形说明 在开始想写这篇文章之前,我去网上搜索了很多关于线程状态转换的图,我惊讶的发现:超过80%的图都是不完整的,或者是错的。所以我只好再次去阅读源码,然后画出下面的这张图,理解了这张图,对于大家理解java 线程的方法调用及开发过程会有很大的帮助。 同步阻塞状态比较好理解,就
在上学的时候,老师讲到进程与线程的时候可能是这样讲的: 进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单元,是应用程序运行的载体。 线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分
问题描述 spring boot开发的应用部署到环境上后,没有任何业务访问,CPU利用率长期100%。 定位思路 初步判断 大量异步任务导致CPU占用率搞 排查 排查代码中使用ExcutorService的地方,及异步任务(spring的@Scheduled)。 发现有使用@Scheduled,根据配置和实际的业务处理、异步任务打
最近有很多小伙伴吃了蚂蚁金服上市的酸柠檬,觉得马爸爸说的福报还是存在的。有人问我,进阿里到底难不难? 拜托,小天也没进去,我怎么知道? 但是,本着刨根问底的精神,小天搜索了很多阿里Java开发岗位的招聘信息,把那些通用的常见的技术要求归纳一下,还没来得及做统计,但是下面的这张截图也八九
图形说明 在开始想写这篇文章之前,我去网上搜索了很多关于线程状态转换的图,我惊讶的发现:超过80%的图都是不完整的,或者是错的。所以我只好再次去阅读源码,然后画出下面的这张图,理解了这张图,对于大家理解java 线程的方法调用及开发过程会有很大的帮助。 同步阻塞状态比较好理解
TcpServer拥有Acceptor类,新连接到达时new TcpConnection后续客户端和TcpConnection类交互。TcpServer管理连接和启动线程池,用Acceptor接受连接。 // Copyright 2010, Shuo Chen. All rights reserved. // http://code.google.com/p/muduo/ // // Use of this sourc
1.线程池核心参数含义 线程池源码,咱们先依次介绍下各个参数的含义: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,
从业十多年,我从一位向往大厂的面试者成为了一个大厂面试官,身边很多从事Java 开发的朋友都不时咨询如何才能进大厂。的确,进大厂对于大多数人来说,绝不只是谈资,而是一种技术追求。 像阿里、腾讯、字节这样的大厂,技术氛围和技术规范都明显优于体量较小的公司,业务场景也更加丰富、更具
4、强引用、软引用、弱引用、幻象引用有什么区别? 典型回答 不同的引用类型,主要体现的是对象不同的可达性(reachable)状态和对垃圾收集的影响。 所谓强引用(“Strong” Reference),就是我们最常见的普通对象引用,只要还有强引用指向一个对象,就能表明对象还“活着”,垃圾收集器不会碰
# 并发编程三大特性## 原子性一个操作或者多次操作,要么所有的操作全部都得到执行并且不会受到任何因素的干扰而中断,**要么所有的操作都执行,要么都不执行**。对于基本数据类型的访问,读写都是原子性的【long和double可能例外】。如果需要更大范围的原子性保证,可以使用synchronized关
开启8个线程,每个线程开启8个协程 计算数的平方 代码: import gevent.pool import gevent.monkey gevent.monkey.patch_all() import concurrent.futures def go(n): return n*n def geventgo(list): mypool = gevent.pool.Pool(8) #协程池,开启8个协程 results = myp
4、多线程 4.1、什么是进程?什么是线程? 进程是一个应用程序(1个进程是一个软件)。 线程是一个进程中的执行场景/执行单元。 一个进程可以启动多个线程。 4.2、对于java程序来说,当在DOS命令窗口中输入: java HelloWorld 回车之后。 会先启动JVM,而JVM就是一个进程。 JVM再启
3、Java中有三大变量?【重要的内容。】 实例变量:在堆中。 静态变量:在方法区。 局部变量:在栈中。 以上三大变量中: 局部变量永远都不会存在线程安全问题。 因为局部变量不共享。(一个线程一个栈。) 局部变量在栈中。所以局部变量永远都不会共享。 实例变量在堆中,堆只有1个。 静态
上面是线程的执行周期 这个线程的生命周期,可以看到时间都浪费在了创建和销毁的这里了. 实际上执行业务的时间只有1s 在高并发的时候,如果持续的去,创建,销毁,那么是很浪费时间的 这个时候就需要用线程池 用了线程池以后,线程的创建用的3秒,销毁用的2秒就没有了, 只剩运行