JVM基础 -- Instrumentation + sa-jdi 工具构建
本文首先介绍测量对象内存布局的其中一种方法,Instrumentation + sa-jdi
核心代码
代码托管在:https://github.com/zhongmingmao/java_object_layout
采用Instrumentation + sa-jdi的方式需要自己编写代码,比较繁琐,OpenJDK提供的JOL (Java Object Layout) 工具则是开箱即用,非常方便,后续博文会进一步介绍JOL的使用
测量对象大小通过Instrumentation测量对象占用的空间大小
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293/** * 对象占用字节大小工具类<br/> * see http://yueyemaitian.iteye.com/blog/2033046 ...
JVM基础 -- VirtualMachineError实例
VirtualMachineError有两个常见的实现类:StackOverflowError、OutOfMemoryError,本文将用代码分析几种情况的VirtualMachineError
JVM参数
内存区域
虚拟机栈VM Stack
堆Heap
方法区Method Area
共享/隔离
线程隔离
线程共享
线程共享
存放的数据
栈帧 Stack Frame
对象实例/数组
类信息、常量、静态变量等数据
异常情况
StackOverflowErrorOutOfMemoryError
OutOfMemoryError
OutOfMemoryError
JVM参数
-Xss
-Xms-Xmx
-XX:PermSize-XX:MaxPermSize-XX:MetaspaceSize-XX:MaxMetaspaceSize
注:在JDK8之前,Hotspot JVM采用永生代(Permanent Generation)来实现方法区(Method Area),从JDK8开始,已经移除了永生代,使用Metaspace进行替代,相关连接请参考:
http:/ ...
Vim -- 文件
本文将介绍Vim中的文件
基础文件、缓冲区和编辑会话文件:存储在磁盘上缓冲区:存在于内存中编辑会话:执行一次vim命令,默认显示第一个文件的缓冲区,其他文件的缓冲区为后台缓冲区
缓冲区列表一次编辑会话可以在多个缓冲区上工作,这多个缓冲区就是缓冲区列表
123456789101112131415161718192021222324252627# 展示缓冲区列表:ls:列出所有被载入到内存中的缓冲区列表 -:非活动的缓冲区 a:激活的缓冲区 h:隐藏的缓冲区 =:只读的缓冲区 +:已经修改但尚未写入磁盘的缓冲区 #:轮换缓冲区,通过<C-^>切换成当前缓冲区 %:当前缓冲区,通过<C-^>把当前缓冲区切换成轮换缓冲区 <C-^>:#与%切换# 遍历缓冲区列表bp[rev]:上一个缓冲区bn[ext]:下一个缓冲区bf[irst]:第一个缓冲区bl[ast]:最后一个缓冲区b[uffer] {N}:直接跳转到第{N}个缓冲区,例如:b 3b[uffer] {bufferNam ...
Vim -- 命令行模式
本文将介绍Vim中的命令行模式
基础8种模式
普通模式:Vim的自然放松状态,也是Vim的默认模式;操作符和动作命令结合在一起;操作 = 操作符 + 动作命令
插入模式:与Sublime Text默认模式类似
插入-普通模式:这是普通模式的一个特例,让我们从插入模式执行一次普通模式命令,然后回归插入模式,按键为<C-o>
替换模式:与插入模式的区别:在替换模式中输入会替换文档中的已有文本
虚拟替换模式(推荐):制表符当成一组空格进行处理,假设制表符列宽为8,输入的前7个字符时,每个字符会被插入到制表符之前,当输入第8个字符时,该字符会替换制表符
可视模式:允许我们选中一块文本区域并在其上进行操作;面向字符(v)、面向行(SHIFT+v)、面向列(<C-v>)
选择模式:与Word和Sublime Text的操作模式类似,当选中一段文本后,再输入任何可见字符,选择的文本会被删除
命令行模式:行编辑器ex是vi的先祖,vim支持Ex命令
模式切换
常用Ex命令操作缓冲区文本的常用Ex命令(完整列表:h ex-cmd-index)[range]:连续的行
1234567 ...
Vim -- 可视模式
本文将介绍Vim中的可视模式
基础可视模式Vim的可视模式允许我们选中一块文本区域并在其上进行操作
语法规则与普通模式的语法规则次序颠倒普通模式的语法规则:{operator}{motion}可视模式的语法规则:先选中选区,再触发可视命令;类似于典型文本编辑器的操作模式
选择模式典型文本编辑器的操作模式:当选中一段文本后,再输入任何可见字符,选择的文本会被删除可视模式和选择模式相互切换:<C-g>
123456:help Select-mode8. Select mode *Select* *Select-mode*Select mode looks like Visual mode, but the commands accepted are quite different. This resembles the selection mode in Microsoft Windows.When the 'showmode' option is s ...
Vim -- 插入模式
本文将介绍Vim中的插入模式
基础插入模式i:在当前字符的左边插入I:在当前行首插入a:在当前字符的右边插入A:在当前行尾插入o:在当前行下面插入一个新行O:在当前行上面插入一个新行c{motion}:删除 motion 命令跨过的字符,并且进入插入模式 c$:删除从光标位置到行尾的字符并且进入插入模式 ct!:删除从光标位置到下一个叹号(但不包括)cc:剪切当前行并且进入插入模式C:等同于c$s:删除光标处字符,并进入插入模式S:删除当前行并进入插入模式,等同于cc
插入-普通模式这是普通模式的一个特例,让我们从插入模式执行一次普通模式命令,然后回归插入模式,按键为<C-o>
替换模式与插入模式的区别:在替换模式中输入会替换文档中的已有文本触发命令:r,R
虚拟替换模式(推荐)把制表符当成一组空格进行处理假设制表符列宽为8,输入的前7个字符时,每个字符会被插入到制表符之前,当输入第8个字符时,该字符会替换制表符触发命令:gr,gR
使用样例插入模式中撤销修改<C-h>:删除前一个字符<C-w>:删除前一个单词<C-u>: ...
Vim -- 普通模式
本文将介绍Vim中的普通模式
基础概念普通模式(normal mode)是Vim的自然放松状态,也是Vim的默认模式其他文本编辑器大部分时间都处于类似Vim插入模式的状态中普通模式之所以强大,主要由于它可以把操作符和动作命令结合在一起:**操作 = 操作符 + 动作命令**
12345:h operatorThe motion commands can be used after an operator command,to have the command operate on the text that was moved over.That is the text between the cursor position before and after the motion.Operators are generally used to delete or change text.
语法规则{operator}{motion}{operator}{operator}(motion默认为当前行)
操作符待决模式该模式 ...
Vim -- 命令.
本文将介绍Vim中的命令.
基础Vim启动命令12# 不加载配置文件,且不启用vi兼容模式$ vim -u NONE -N
Vim手册1234567$ man vim-u {vimrc} Use the commands in the file {vimrc} for initializations. All the other initializations are skipped. Use this to edit a special kind of files. It can also be used to skip all initializations by giving the name "NONE". See ":help initialization" within vim for more details.-N No-compatible mode. Reset t ...