在 Java 中, GC 的对象是堆空间和永久区
引用计数算法
Java 不再使用
Python,COM,ActionScript3 使用
性能差
不能解决循环引用问题
标记 - 清除算法标记阶段在标记阶段,首先通过根节点,标记所有从根节点开始的可达对象
清除阶段清除所有未被标记的对象
标记 - 压缩算法
标记 - 压缩算法适合用于存活对象较多的场合,如老年代.它在标记 - 清除算法的基础上做了一些优化.
标记阶段从根节点开始,对所有可达对象做一次标记
压缩阶段将所有存活对象压缩到内存一端, 然后清除边界外的所有空间
复制算法
与标记 - 清除算法相比, 复制算法是一种相对高效的回收方式
不适合存活对象较多的场合, 如老年代
将原来的内存分为相同大小的两块, 每次只是用其中一块, 在垃圾回收时, 将正在是用的内存中的对象复制到未使用的内存块中, 之后清除正在是用的内存中的所有对象,交换两个内存的角色, 完成垃圾回收
问题:
空间浪费, 只是用了一半
是用标记清理和复制算法配置回收垃圾
在最上面那块大的区域产生新对象。
大对象不太适合在复制空间,因为复制空间的容量是有 ...
volatile 关键字的 2 个语义
内存可见性
阻止重排序
volatile 不能保证原子性
volatile 关键字的 2 层含义:
用 volatile 修饰的变量, 线程在每次使用变量的时候, 都会读取变量修改后的最新的值.作为指令关键字, 确保本条指令不会因编译器的优化而省略, 且要求每次直接读值.
可见性可见性是指 当一个线程修改了一个共享变量, 其他线程能够立刻得知这个修改.这里有必要了解一下 Java 的内存模型
被 volatile 修饰的变量, 当线程需要使用这个变量时, 回去主内存中读取, 然后加载到自己的工作线程中,工作线程中的变量只是主存变量的一个拷贝, 当使用完这个变量后, 会刷新会主存中.
当数据中主内存复制到工作内存存储时, 必须出现两个动作:
由主内存执行的 read 操作
有工作内存执行相应的 load 操作
当数据从工作内存拷贝到主内存时, 也会有两个操作:
用工作内存执行的 store 操作
用主内存执行相应的 write 操作
volatile 的特殊规则就是 read、load、use 必须连续出现. assign、st ...
生产者消费者问题是研究多线程程序时绕不开的经典问题之一, 它描述是有一块缓冲区作为仓库, 生产者可以将产品放入仓库, 消费者则可以从仓库中取走产品
生产者消费者问题生产者消费者问题是研究多线程程序时绕不开的经典问题之一, 它描述是有一块缓冲区作为仓库, 生产者可以将产品放入仓库, 消费者则可以从仓库中取走产品.解决生产者 / 消费者问题的方法可分为两类:
采用某种机制保护生产者和消费者之间的同步;
在生产者和消费者之间建立一个管道.
第一种方式有较高的效率, 并且易于实现, 代码的可控制性较好, 属于常用的模式. 第二种管道缓冲区不易控制, 被传输数据对象不易于封装等, 实用性不强.
同步问题核心在于:如何保证同一资源被多个线程并发访问时的完整性.常用的同步方法是采用信号或加锁机制, 保证资源在任意时刻至多被一个线程访问.Java 语言在多线程编程上实现了完全对象化, 提供了对同步机制的良好支持.在 Java 中一共有五种方法支持同步, 其中前四个是同步方法, 一个是管道方法.
wait()/ notify() 方法
await()/ signa ...
新时代码农
未读几个多线程概念的介绍
线程状态转换
新建 (new): 新创建一个线程对象
可运行 (runnable):线程对象创建后,其他线程(比如 main 线程)调用了该对象的 start() 方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 。
运行 (running):可运行状态(runnable) 的线程获得了 cpu 时间片(timeslice) ,执行程序代码。
阻塞 (block):阻塞状态是指线程因为某种原因放弃了 cpu 使用权,也即让出了 cpu timeslice,暂时停止运行。直到线程进入可运行(runnable) 状态,才有机会再次获得cpu timeslice 转到运行 (running) 状态。阻塞的情况分三种:
等待阻塞:运行 (running) 的线程执行 o.wait()方法,JVM 会把该线程放入等待队列 (waitting queue) 中。
同步阻塞:运行 (running) 的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则 JVM 会把该线程放入锁池 (lock pool) 中。
其他阻塞:运行 (runnin ...
新时代码农
未读总结方法区和运行时常量池
相关特征方法区特征
同 Java 堆一样, 方法区也是全局共享的一块内存区域
方法区的作用是存储 Java 类的结构信息, 当我们创建对象实例后, 对象的类型信息存储在方法堆之中, 实例数据存放在堆中;实例数据指的是在 Java中创建的各种实例对象以及它们的值, 类型信息指的是定义在 Java代码中的常量、静态变量、以及在类中声明的各种方法、方法字段等等;同事可能包括即时编译器编译后产生的代码数据.
JVMS 不要求该区域实现自动的内存管理, 但是商用 JVM 一般都已实现该区域的自动内存管理.
方法区分配内存可以不连续, 可以动态扩展.
该区域并非像 JMM 规范描述的那样数据一旦放进去就属于 “永久代”; 在该区域进行内存回收的主要目的是对常量池的回收和对内存数据的卸载;一般来说这个区域的内存回收效率比起Java 堆要低得多.
当方法区无法满足内存需求时, 将抛出 OutOfMemoryError 异常.
运行时常量池的特征
运行时常量池是方法区的一部分, 所以也是全局共享的.
其作用是存储 Java 类文件常量池中的符号信息.
class ...
几个并发概念的介绍
同步(synchronous)和异步(asynchronous)
同步调用会等待方法的返回, 异步调用会马上返回, 但是异步调用返回并不代表人任务已经完成, 它会在后台启个线程继续进行任务
并发(Concurrency)和并行(Parallelism)
并发和并行在外在表象来说, 是差不多的. 由图所示, 并行则是两个任务同时进行, 而并发呢, 则是一会做一个任务一会又切换做另一个任务. 所以单个 cpu是不能做并行的, 只能是并发.
临界区
临界区用来表示一种公共资源或者说是共享数据, 可以被多个线程使用, 但是每一次, 只能有一个线程使用它, 一旦临界区资源被占用, 其他线程要想使用这个资源,就必须等待.
阻塞(Blocking)和非阻塞(Non-Blocking)
阻塞和非阻塞通常用来形容多线程间的相互影响. 比如一个线程占用了临界区资源, 那么其它所有需要 这个资源的线程就必须在这个临界区中进行等待,等待会导致线程挂起. 这种情况就是阻塞. 此时, 如 果占用资源的线程一直不愿意释放资源, 那么其它所有阻塞在这个临界区上的线程都不能工作. ...
新时代码农
未读本文将带你深入了解 tmux 的基本操作和使用技巧,让你能够更高效地使用终端。我们将从安装、配置、常用命令以及插件等方面进行详细介绍。
一、什么是 tmux?tmux 是一个终端复用软件,它可以将多个终端窗口合并到一个窗口中,从而提高工作效率。简单来说,它可以让你在一个终端窗口中同时打开多个会话(session)、窗口(window)和面板(panel),并进行自由切换和管理。
二、安装与配置
安装
123git clone https://github.com/gpakosz/.tmux.git .oh-my-tmuxln -s -f .oh-my-tmux/.tmux.conf ~/.tmux.confcp .oh-my-tmux/.tmux.conf.local ~/.tmux.conf.local
插件安装
1git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
三、常用命令
会话管理
新建会话:tmux new -s my_session_name
切换会话:tmux at -t se ...
Homebrew 是 macOS 和 Linux 上的包管理器,允许用户通过命令行轻松安装、更新和管理软件包。它极大地简化了软件包的获取和维护过程,尤其适合开发者。本文将深入探讨 Homebrew 的功能、安装方式、核心命令以及一些进阶用法,帮助你快速上手并高效管理开发环境。
什么是 Homebrew?Homebrew 是一个开源项目,由 Max Howell 在 2009 年发布,旨在为 macOS 用户提供类似 Linux 包管理器的体验。Homebrew 的设计哲学是“将复杂的事情简单化”,它能自动解决依赖关系并优化安装过程,为开发者提供了一种轻量级、无 GUI 的方式来安装各种开发工具。现在,Homebrew 也扩展支持了 Linux 系统,使其成为跨平台的工具。
为什么使用 Homebrew?macOS 自带的系统工具和开发环境比较有限,Homebrew 通过一系列命令行工具简化了软件包的安装和管理流程,为 macOS 和 Linux 用户提供了一套完善的包管理方案。相比于手动下载和配置软件,Homebrew 能自动配置依赖项、路径和更新管理等工作,让用户可以专注于开发而不是 ...
项目搭建采用技术栈为:Spring+Spring MVC+Hibernate+Jsp+Gradle + tomcat+mysql5.6
搭建环境文档目录结构说明:
使用 Intellj Idea 搭建项目过程详解
项目各配置文件讲解及部署
各层包功能讲解 & 项目搭建完毕最终效果演示图
项目中重要代码讲解
配置 tomcat 运行环境
webapp 文件夹下分层详解
1. 使用 Intellj Idea 搭建项目过程详解1.1 打开 Intellj Idea
1.2 操作 Intellj Idea 工具栏 新建项目
需要说明的是,最初创建的项目视图是不完整的,包括 webapp 文件夹下没有 web.xml,以及 src 包下缺少 Java 文件夹 (放置 java 源代码文件),Resources 文件夹(放置项目配置文件)。
我们继续做以下操作,使得项目的结构符合 web 应用项目的层级标准。
出现如下视图:
接下来:单击 main 文件夹按照如下操作:
屏幕快照 2016-11-20 下午 4.44.33.png
点击 ok,再按照上图操作操 ...
要想统一处理所有 http 请求和响应,就得用上 axios 的拦截器。通过配置 http response inteceptor,当后端接口返回 401 Unauthorized(未授权),让用户重新登录。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970// http request 拦截器axios.interceptors.request.use( config => { if (store.state.token) { // 判断是否存在token,如果存在的话,则每个http header都加上token config.headers.Authorization = `token ${store.state.token}`; } retu ...
Sublime Text 是一个强大的文本编辑器,提供了丰富的快捷键来提高编程效率。以下是 Sublime Text 中一些常用的快捷键。
基本操作
打开命令面板:Shift + Cmd + P
控制台:Ctrl + (反引号)
新建标签页:Cmd + N
切换标签页(通过数字):Cmd + 数字
分成两屏显示:Cmd + Option + 2
查找与替换
查找文本:Cmd + F
查找并替换文本:Option + Cmd + F
跳转到函数或方法:Cmd + R
添加/删除选中行的注释:Cmd + /
编辑与格式化
智能缩进(增加或减少缩进):Cmd + [ 或 Cmd + ]
显示/隐藏侧边栏:Cmd + K, B
**删除光标前所有字符 (Mac)**:Cmd + Delete
JSON 和 HTML 格式化
格式化 JSON 文件:Ctrl + Cmd + J
格式化 HTML 文件:Shift + Cmd + H
具体命令列表以下是一些具体操作对应的快捷键:
文件跳转: Cmd + T
行号跳转 (类似 Vim 的 num + gg): Ctr ...
在 macOS 操作系统中,快捷键是提高工作和生活效率的重要工具之一。掌握这些常用快捷键能让你更加得心应手地操作电脑。本文将详细介绍 macOS 系统、应用程序以及开发工具相关的快捷键。
常用 macOS 快捷键系统级快捷键
控制 + shift + 关机键 - 让 Mac 进入休眠模式。
开机时按住 shift+enter - 忽略自启动软件,直接加载系统。
控制 + f2 - 在任务栏(Dock)上移动焦点。
控制 + f3 - 选择 dock 中的应用或图标。
opt + cmd + 右上角 - 锁定屏幕。
option + command + esc - 强制退出未响应的应用程序。
control + 右上角 - 调出关机帮助界面。
Ctrl + 关机键 - 显示关机提示对话框,可以取消关闭操作。
Ctrl + Opt + 关机键 - 安全地关闭 Mac 电脑。
Ctrl + Cmd + 关机键 - 重启 Mac 电脑。
Shift + Ctrl + Opt + 关机键 - 立即断电关闭电脑,不进行任何保存操作,请谨慎使用此快捷键。
opt + \ - 打开 Finder 窗口 ...
在使用终端模拟器和 tmux 时,掌握一些快捷键可以帮助你提高工作效率。以下是 iTerm2 和 tmux 的一些常用快捷键。
iTerm2 快捷键基本操作
打开/关闭 iTerm:F12
快速标记:Cmd+Shift+m
回到标记位置:Cmd+Shift+j
搜索和历史记录
正则表达式搜索:Cmd+f
剪切板历史:Cmd+Shift+h
显示命令历史记录:Cmd+;
切换 Tab 和 Pane
切换 tab: Cmd+←, Cmd+→, Cmd+{, Cmd+}
新建 tab: Cmd+t
顺序切换 pane: Cmd+[, Cmd+]
按方向切换 pane: Cmd+Option+方向键
切分屏幕
水平切分: Cmd+d
垂直切分: Cmd+Shift+d
其他快捷操作
高亮显示鼠标指针:Cmd+/
快照返回: Cmd+Option+b
文本编辑相关
Ctrl+q: 清空当前行
⌃ + u: 删除从当前位置到行首的内容
⌃ + a: 移动到行首
⌃ + e: 移动到行尾
⌃ + f: 向前移动一个字符
⌃ + b: 向后移动一个字符
⌃ + ...
IntelliJ IDEA 是一款功能强大的集成开发环境(IDE),它提供了丰富的快捷键来提高编程效率。下面是一些常用的编辑器背景色、行号栏颜色以及控制台背景色的设置方法,同时涵盖了自定义代码折叠和一些 IDEA 常用及自定义快捷键。
设置编辑器颜色
编辑器背景色:
前往 Preference -> Editor -> Color & Fonts -> Editor -> General -> Text -> Default text
行号栏的颜色:
前往 Preference -> Editor -> Color & Fonts -> General -> Editor -> Gutter background
控制台背景色设置:
在 Setting 中找到 Editor,然后选择 color Scheme -> console Colors。右侧的 Console 部分可以调整背景颜色。
其他编辑器颜色设置:
调整光标当前行颜色:前往 Editor -> Colors ...