Java对象的内存布局
java对象的额外内存开销(对象头)运行数据 (8字节)包括
哈希码
GC信息
所信息
对象类型指针 (8字节)
指向对象对应的类
压缩指针
通过 jvm命令选项开启 -XX:+UseCompressedOops这里针对对象类型指针, 实际上对所有引用指针起作用
对于64位java虚拟机 64位 -> 32位因此java对象的额外内存开销为12字节
内存对齐
通过jvm选项 -XX:ObjectAlignmentlnBytes开启进一步提升了寻址范围. 同时也有可能增加对象间内存填充, 倒置压缩指针没有到达原本节省空间的效果.
对象内存对齐对象内字段内存对齐java虚拟机要求long字段,double字段以及非压缩指针状态下的引用字段地址为8的倍数
do for what?
让字段支出现在同一CPU的缓存行种. 如果字段不是对齐的, 那么可能出现跨缓存行的字段. 该对象的读取可能需要替换两个缓存行, 该字段的存储也会同时污染来那个缓存行. 对程序的执行效率不利.
字段重排列
通过jvm选项 -XX:FieldsAllocationStyle(默认为1)开启java虚拟机重新分配源代码中声明的字段先后顺序, 以达到内存对齐的目的.
规则
如果字段占据C个字节, 那么该字段的偏移量需要对齐至NC. 这里偏移量指的是字段起始地址与对象的起始地址的差值
例如: Long类型有一个long字段, 在使用了压缩指针的64位虚拟机中
1long字段的地址 = n*16 + 对象起始地址 (n=1)
子类所继承的偏移量, 需要与父类的对应字段一致在具体实现中,Java 虚拟机还会对齐子类字段的起始位置。对于使用了压缩指针的 64 位虚拟机,子类第一个字段需要对齐至 4N;而对于关闭了压缩指针的 64 位虚拟机,子类第一个字段则需要对齐至 8N。
class A { long l; int i;}
class B extends A { long l; int i;}我在文中贴了一段代码,里边定义了两个类 A 和 B,其中 B 继承 A。A 和 B 各自定义了一个 long 类型的实例字段和一个 int 类型的实例字段。下面我分别打印了 B 类在启用压缩指针和未启用压缩指针时,各个字段的偏移量。
启用压缩指针时,B 类的字段分布B object internals:
123456789OFFSET SIZE TYPE DESCRIPTION 0 4 (object header) 4 4 (object header) 8 4 (object header) 12 4 int A.i 0 16 8 long A.l 0 24 8 long B.l 0 32 4 int B.i 0 36 4 (loss due to the next object alignment)
当启用压缩指针 ...
Java工具集LTS
使用javap来查看字节码
默认情况下打印所有非私有方法和字段
-p选项 还会打印私有方法和字段
-v选项 尽可能打印所有信息(这里指)
-c选项 只查看方法对应字节码
JOL工具
12curl -L -O http://central.maven.org/maven2/org/openjdk/jol/jol-cli/0.9/jol-cli-0.9-full.jarjava -cp jol-cli-0.9-full.jar org.openjdk.jol.Main internals java.lang.String
jol地址已失效 -> 新地址
jvm调试命令-XX:+
-XX:+UseCompressedOops
开启对象压缩指针 64位 -> 32 位
这里使用内存对齐(8位)使后三位为0, 也可以用这3位来记录一些额外信息 扩大寻址范围32位->35位.
-XX:ObjectAlignmentLnBytes
字节对齐 java虚拟机堆中的起始地址需要对齐至8的倍数
对象之间有内存对齐, 对象之间的字段也需要内存对齐(否则, 字段的读取需要替换两个缓存行, 存储会同时污染来那个缓存行, 影响执行效率)
jps
打印所有正在运行的进程的相关信息。
帮助文档
-m 将打印传递给Java虚拟机的参数
-l 将打印模块名以及包名
-v 将打印传递给 Java 虚拟机的参数(如-XX:+UnlockExperimentalVMOptions -XX:+UseZGC)
jstat
打印目标Java进程的性能数据。
帮助文档$ jstat -options-class-compiler-gc-gccapacity-gccause-gcmetacapacity-gcnew-gcnewcapacity-gcold-gcoldcapacity-gcutil-printcompilation
例:
1jstat -gc -t 22126 1s 4
jmap
分析虚拟机堆中的对象
帮助文档-clstats-finalizerinfo-histo-dump
例:
1jmap -histo 22574
注意
以及jinfo、jstack和jcmd依赖于Java虚拟机的Attach API,因此只能监控本地Java进程一旦开启Java虚拟机参数DisableAttachMechanism(-XX:+DisableAttachMechanism),基于Attach API的命令将无法执行。
远程跑java程序是否可以使用这些工具?
jinfo
jinfo命令可用来查看目标Java进程的参数,如传递给Java虚拟机的-X(即输出中的VM Flags),以及可在Java层面通过System.getProperty获取的-D参数(即输出中的System Properties)。可以改动manageable的参数
帮助文档例:
1jinfo 73269
jstack
jstack命令可以用来打印目标Java进程中各个线程的栈轨迹,以及这些线程所持有的锁。
帮助文档jstack的其中一个应用场景便是死锁检测。jstack不仅会打印线程的栈轨迹、线程状态(BLOCKED)、持有的锁(locked …)以及正在请求的锁(waiting to lock …),而且还会分析出具体的死锁。
例:
1jstack 73269
jcmd
可以使用jcmd命令,来代替除 ...
mysql 登录失败
mysql -u root -p报错
ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)
这是因为mysql服务没有启动启动命令如下
mysql.server startorbrew services start mysql
MacOs catalina 配置zsh别名和主题
zsh主题1234autoload -Uz promptinit promptinit prompt -l //列出主题prompt walters
在命令行中用过后添加一下内容(当中的fade是一个主题)到 ~/.zshrc 之后source一下,就配置到zsh了
123autoload -Uz promptinitpromptinitprompt fade "red"
zsh配置别名配置文件 ~/.zshrc配置方式例如:
12alias zshconfig="vim ~/.zshrc"alias -s py=vi #在命令行输入python文件,会用vim打开
再source一下
配置OpenCV
Cmake编译Opencv
国庆期间配置了下开发环境,记录一下遇到的坑
一、安装MinGW-64
用于编译opencv库
下载MinGW-64
直接安装即可,注意选择x86_64架构,我选择的是7.3.0版本
另外添加环境变量
可以用 gcc -v 和g++ -v检查
二、 安装cmake下载cmake
安装
配置环境变量
可以用cmake –version检查
三、 安装clion
JetBrains家的一款c(c++)IDE
默认安装即可
激活码1812LFWMRSH-eyJsaWNlbnNlSWQiOiI4MTJMRldNUlNIIiwibGljZW5zZWVOYW1lIjoi5q2j54mIIOaOiOadgyIsImFzc2lnbmVlTmFtZSI6IiIsImFzc2lnbmVlRW1haWwiOiIiLCJsaWNlbnNlUmVzdHJpY3Rpb24iOiIiLCJjaGVja0NvbmN1cnJlbnRVc2UiOmZhbHNlLCJwcm9kdWN0cyI6W3siY29kZSI6IklJIiwiZmFsbGJhY2tEYXRlIjoiMjAxOS0wNC0yMSIsInBhaWRVcFRvIjoiMjAyMC0wNC0yMCJ9LHsiY29kZSI6IkFDIiwiZmFsbGJhY2tEYXRlIjoiMjAxOS0wNC0yMSIsInBhaWRVcFRvIjoiMjAyMC0wNC0yMCJ9LHsiY29kZSI6IkRQTiIsImZhbGxiYWNrRGF0ZSI6IjIwMTktMDQtMjEiLCJwYWlkVXBUbyI6IjIwMjAtMDQtMjAifSx7ImNvZGUiOiJQUyIsImZhbGxiYWNrRGF0ZSI6IjIwMTktMDQtMjEiLCJwYWlkVXBUbyI6IjIwMjAtMDQtMjAifSx7ImNvZGUiOiJHTyIsImZhbGxiYWNrRGF0ZSI6IjIwMTktMDQtMjEiLCJwYWlkVXBUbyI6IjIwMjAtMDQtMjAifSx7ImNvZGUiOiJETSIsImZhbGxiYWNrRGF0ZSI6IjIwMTktMDQtMjEiLCJwYWlkVXBUbyI6IjIwMjAtMDQtMjAifSx7ImNvZGUiOiJDTCIsImZhbGxiYWNrRGF0ZSI6IjIwMTktMDQtMjEiLCJwYWlkVXBUbyI6IjIwMjAtMDQtMjAifSx7ImNvZGUiOiJSUzAiLCJmYWxsYmFja0RhdGUiOiIyMDE5LTA0LTIxIiwicGFpZFVwVG8iOiIyMDIwLTA0LTIwIn0seyJjb2RlIjoiUkMiLCJmYWxsYmFja0RhdGUiOiIyMDE5LTA0LTIxIiwicGFpZFVwVG8iOiIyMDIwLTA0LTIwIn0seyJjb2RlIjoiUkQiLCJmYWxsYmFja0RhdGUiOiIyMDE5LTA0LTIxIiwicGFpZFVwVG8iOiIyMDIwLTA0LTIwIn0seyJjb2RlIjoiUEMiLCJmYWxsYmFja0RhdGUiOiIyMDE5LTA0LTIxIiwicGFpZFVwVG8iOiIyMDIwLTA0LTIwIn0seyJjb2RlIjoiUk0iLCJmYWxsYmFja0RhdGUiOiIyMDE5LTA0LTIxIiwicGFpZFVwVG8 ...
java入门学习
Java (c++-)学习笔记 day1 4/14 2019
Java 核心优势:跨平台/可移植性Java 各个版本javaEE(Java Enterprise Edition):企业版:定位在服务器上的应用<br>
JavaME:微型版----会被安卓取代<br>
JavaSE==:(Java Sandard Edition) :标准版:定位在个人计算机的应用<br>
Java 特点简单,分布式,多线程,高性能,健壮 JVM/JRE/JDKJVM(Java Virtual Machine)虚拟机执行字节码
JRE(Java Runtime Environment) :包含jvm,库函数,必须文件
JDK(Java Development Kit):包含Jre
day2 4/15 2019
抽象类和抽象方法
1.有抽象方法的类只能是抽象类
2.抽象类不能实例化(不能用new实例化抽象类),可以用子类实例
3.抽象类可以包含属性、方法、构造方法,但是构造方法不能用来new实例,只能用来被子类调用
4.抽象类只能被继承
5.抽象方法必须被子类实现接口和多继承接口interface(接口就是规范)
方法全部为抽象方法
变量全为常量
支持多继承
不能创建实例 ,但是可以用于引用变量类型
jdk1.8后包含普通的静态方法实现implement(类似extends)内部类非静态内部类
day3 4/16 2019
容器类
collection 容器(集合)
List 有顺序,可重复
ArrayList
LinkedList
Set 无顺序,不可重复
HashSet
Map 键值对
HashMap
TreeMap
collection
方法
123456789101112add()toArrary()isempty()remove()contains()size()clear()-----------------------------------addAll()containsAll()removeAll()retainAll()
set方法和collection基本相同
set 不允许`e1.equals(e2)==true`的对象放入List
有序:List中每个元素都有索引标记
可重复:允许加入重复的元素
ArrayList(数组)123456789indexOf() 返回第一次出现的对象的索引值 lastIndex() 返回最后一次出现的对象的索引值copyOf(elementData , int)copyadd(E)add(int,E)remove(int)System.arraycopy(elementData ,index+1,elementData,index)clear()
LinkedList(链表)Vector(线程安全的数组)泛型
Java中泛型的引入是通过泛型擦除机制来实现的泛型只在编译中被编译器javac识别&使用,用来确保数据的安全性&免去强制类型转换的麻烦。
可以用继承的方式限制参数类型
extends Number类可以起到c#中 where T:struct的作用
day4 4/27 2019
Java异常类型机制类结构
Thrwoable
Error
Exception
CheckedException
RuntimeException
uncheckExceptionRutimeException
运行时异常由JRE抛出 ...