jps
-q 仅输出vm标识
-v jvm参数
-m main方法参数
-l 完整包名
javac -g 编译
javap -c -v -p -s -lmat jprofiler
可触及,可复活,不可触及
String 是bootstrapclassloader 加载
mark-sweep 标记清除
mark-compact 标记压缩
RunTime.getRunTime.gc
System.gc调用的上边的方法
bump the pointer 指针碰撞
g1 垃圾回收期 分regioniconst -1~5
bipush -128~127
sipush 两字节
在finally改变return的值
如果是引用类型会生效,如果是基本类型无作用
try块里return时已经把要返回的压栈。jstat -gc pid
jstack pid 查看死锁
jinfo -flag 参数 pid
-XX:PrintFlagInitial
-XX:PrintFlagFinal
-XX:PrintGcTimeStamps
jinfo -flags pid
jmap -heap pid
jstat -class pid
jmap -heap pid > a.txt
jmap -histo pid
jstat -class pid
jmap -dump:format=b,file=/a
-XX:HeapDumpPath=/dd
Thread.getAllStackTraces()
a=“a”+“b”
b= “ab”
a==b true 编译器就确定
newInstance()只能调用空参构造器,且必须是public
push入操作数栈
store 载入到本地变量表
load本地变量表到操作数栈
new 压栈this
dup 复制栈顶this
invokespecial 弹出一个this
string 的 + 字符拼接调用的是 stringBuilder 的append方法
final修饰的拼接编译器优化,不调用。5.0之后才有
toString生成的不进常量池
代码中双引号出现的字符串会在常量池
String s1 = new String(“a”)+new String(“b”)
s1.intern
jdk7执行后 常量池中没创建对象,创建了一个指向堆中此对象的指针
String s2 = “'ab”;
s1==s2 jdk7+
s1!=s2 jdk6-
非”“生成的字符串不在常量池,调用intern后查询常量池,如果包含则返回常量池地址,不包含则新建再返回新建的地址。
ByteBuffer.allocateDirec()
对象包含对象头,实例数据和padding
对象头包含hashcode,分代年龄,锁状态,klass指针
JIT just in time compilernew RandomAccessFile(file,“rw”)独写 (file,“r”)只读
Integer.toHexString toOctalString toBinaryString
Integer.value(“FF”,16).toString (“77”,8) (“10”,2)
subString(begin,offset) 从begin开始,到offset-1
insert into table values ()
delete table where a =1
select a,b from table where a =1
update table a=1,b=2 where a =3
update table a=1 and b=2 where a=3(错误,会把a=3的改成a=0,b不变)
create table; drop table; alter table ; create database;drop database;
& 与 | 或 ~ 非 ^异或
<< 左移 short byte 左移转为int >>右移 >>>无符号右移
Map map = new HashMap<>();
Set set = map.entrySet();
Iterator it = set.iterator();
Map.Entry enter = it.next();
enter.getKey(); enter.getValue();
Calendar.getInstance().getTimeMillis()
c = Calendar.getInstance()
c.get(c,year)
new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”)
Date d = s.parse(String)
InputStream
int available()可读字节
void close()
int read() 返回读到字符的整形编码 ascii
int read(byte[] buffer)读取buffer.length字节,如结尾,返回-1
ByteArrayInputStream(byte[] buffer) (byte[] buf ,offset,len)
ByteArrayOutputStream toByteArray();
System.in System.out
BufferReader br = new BufferReader(new InputStreamReader(System.in))
br.readLine()
getProperties()虚拟机当前环境
Properties是HashTable的子类Random r = new Random()
r.next()System.currentTimeMillis();
long startTime = new Date().getTime();
public static native void arrayCopy(Object src,int srcPos,Object dest,int destPos,int length)
getSession(false)不存在返回null
getSession()相当于getSession(true);不存在则新建一个并返回
线程状态
new terminated run waiting timed-waiting blocked
JSONObject o =new JSONObject();
o.put(k,v)
o.toString();
User user = new User
Map map = new HashMap()
JSON.toJSON(map)
JSON.toJSON(user)
List list;
JSON.parseArray(list)
JSON.parseString(string)
getContextClassLoader
getSystemClassLoader永久代是hotspot对方法区 实现其他虚拟机没有永久代,在1.8中,元空间取代了永久代,永久代在堆中,元空间在本地内存中。
常量池从1开始编号,0特殊意义,表示无指向无引用
I int B byte S short J long D double Z boolean C char F float
L 引用类型 [数组 V void
老年代满了出发fgc
新生代 复制算法 老年代 标记压缩算法
栈中引用出栈后没有立即回收垃圾,gc的时候才会回收
-XX:+PrintGcDetails
RunTime r = RunTime.getRunTime()
r.totalMemory
r.getProcessor()
minor 小版本 major大版本
调优目标,减少fgc
minorgc=ygc majorgc = fgc
stw stop the world
cms concurrent nark sweep 并发标记清除
-标准参数
-X 非标准参数
-XX 实验参数
-Xmn 新生代大小 -Xms 初始堆大小 -Xmx 最大堆大小 建议两者相同,防止内存抖动
线程栈包含 栈帧,本地方法栈,程序计数器
栈帧包含 本地变量表,操作数栈,动态链接,返回地址,附加信息
TLAB thread local allocated buffer
Callable call = new Callable<>(){
@Override
public Integer call(){
return 1;
}
}
FutureTask task = new FutureTask<>(call)
Thread t = new Thread(Task)
Integer i = task.get()BlockingQuene
add ,remove 抛异常
put , take 阻塞
offer,poll 返回true
或false
静态代码先执行,静态代码块和属性按从上到下的顺序执行。
clinit只执行一次
非静态代码块和实例属性按顺序执行,
init new一次执行一次
最后执行constructor 构造方法
先父后子
%d 输出日志时间点的日期(一般是那一天),也可以在其后用大括号自定义格式,比如:%d{yyyy MMM dd HH:mm:ss:SSS},输出类似:2014 11 05 :23:28 :22
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL ;
%r 输出自应用启动到输出该log信息耗费的毫秒数 ;
%c 输出所属的全类名,也可以只输出类名,:%c{1} ;
%t 输出产生该日志的当前线程名字 ;
%m 输出代码中自定义的的信息;
%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n” ;
%l 输出日志发生的代码行位置,在代码中的行数;
每一个百分号后的字母就是具体单词的首字符;比如:c->class t->thread等等