java 的内存结构:
jdk:java develop kit >jre:java runtime environment>jvm:java virtual machine。
hello world javac编译成class文件,再执行。
java 可以跨平台,windows和linux都可以执行,汇编语言不行,实际执行的都是0101 这种二进制码,不一样的平台,二进制码不一样,java的跨平台就是通过jvm实现的。
Java 虚拟机:
- 堆:放对象 GC堆 Eden Suvivor1 survivor2 old(2/3)。优先eden,eden 满了之后,进行GC,minnorGC 字节码执行引擎开启的GC线程。收集垃圾的过程:GC Root 根节点,从本地方法栈找GCRoot ,从这个根出发,找他们引用的对象,成员变量引用的对象,这个链条找完了,全部标记为非垃圾对象,会被复制到空的survivor区。剩余的会被回收(就是可达性分析算法)。经历一次minorGC 分代年龄+1;到15后,会被放到老年代去。对象头信息:分代年龄也放在这里,和锁状态一样。
jdk自带调优工具:jvsiualvm:找本机所有的java进程,会看到进程运行的细节情况和堆的分区的情况,流转情况。
基本的调优命令:Java虚拟机:JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解 - 方志朋的博客
- jmap:内存大小,
- jhotprofile
Arthas:阿里开源的。
- 方法区: 元空间(1.8之后)常量+静态变量+类信息
- 栈:线程栈:有主线程,分配一块主线程栈,有一个线程,就新增,放局部变量。通过栈帧把不同的方法隔开,里面放方法的东西,方法的局部变量,栈帧中还有: *** 作数栈( *** 作数临时的内存空间,运行完出栈)+动态链接(test方法对应的指令码在方法区的入口位置,c++实现的东西)+局部变量表(main方法里也有局部变量,值是个对象,对象放在堆里,引用指针:方值在堆里的地址)+方法出口(test方法运行完,回到main进程,继续执行)。数据结构中的栈,FILO,和方法的嵌套调用是相符合的。可以通过javap-c 看一下反汇编的一些东西,有手册可以看。
- 本地方法栈: 什么是本地方法 native :c c++实现的 本地方法需要的内存空间
- 程序计数器:行号,记录执行到哪里了,为什么设置,因为线程切换;运行完一行代码之后,会变化,怎么变化?谁进行了变化?
- 类加载子系统:
- 字节码执行引擎:去修改程序计数器。
假设有一个math.java--->java.class-->类装载子系统
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)