永刚的点滴成长

导航

 

我对java这门语言的理解:

  主要从以下几个方面阐述:1、java平台无关性(跨平台,一次编译,到处运行);2、GC;3、语言特性(反射,泛型,lamda表达式);4、面向对象(封装,继承,多态);5、类库(java本身自带的集合,并发库,网络库,IO,NIO等;6、异常处理)

如何实现平台无关的:

  编译期javac命令可以把java源文件编译成.class的字节码文件,运行时:不同平台的JVM解析,而不需要重新编译,JVM执行字节码的时候把字节码转换成具体平台的机器指令。

JVM的构成:1、Class Loader,依据指定格式加载class文件到内存。2、Execution Engine 命令解释器 3、Runtime Data Area(Heap,Stack,Method Area,Native Method Stack)内存结构模型 4、Native Interface 融合不同开发语言原生库为java所用。

谈谈ClassLoader:

  JVM的核心组件,主要工作在class的装载阶段,所有的class都是由classLoader加载的,负责将class的二进制数据流装载进系统,交给虚拟机进行连接,初始化等操作。主要由以下4类:

  1、BootStrapClassLoader:C++编写,加载核心库java。

  2、ExtClassLoader:java编写,加载扩展库javax.*。

  3、AppClassLoader:java编写,加载程序所在目录。

  4、自定义的ClassLoader :java编写,定制化(实现findClass来获得Class的字节数据,然后defineClass方法生成类的字节码返回)。

  为什么类加载器为什么要使用双亲委派机制:避免多份同样字节码的加载。

classLoader和ForName的区别

  类的加载方式:1、隐式加载 new  2、显式加载 classLoader、ForName。

  类的装在过程:1、加载,通过classLoader加载class文件字节码,生成Class对象; 2、链接 (校验,准备,解析)3、初始化 执行类变量赋值和静态代码块。

  Class.forName得到的class是已经初始化的。

  ClassLoader.loaderClass得到的class还没有经过链接(ioc中使用这种方式延时加载,从而提升加载性能)。

Java内存模型 jdk8

局部变量表和操作数栈的区别与联系:

局部变量表:包含方法执行时所包含的所有局部变量。bool byte char long short int float,double.

操作数栈:入栈,出栈,复制,交换,产生消费变量。

线程私有:

  1、程序计数器,

  2、本地方法栈,

  3、虚拟机栈(方法执行的内存模型,每个方法执行时都会创建一个栈帧即方法运行期间的基础数据结构,存储局部变量表,操作数栈,动态链接,方法出口,当方法调用结束,帧才会被销毁。)。

线程共享:元空间MetaSpace,常量池的Java堆。

MetaSpace相比PermGen的区别:

  字符串常量池存在永久代中,可能有性能问题或内存溢出的风险.

  类和方法的大小比较难确定其大小,所以对永久代大小空间在指定带来困难.

  永久代会为gc带来不必要的复杂性

JVM三大性能调优参数: -Xms -Xmx-Xss的含义:

-Xss: 定义了每个线程虚拟机栈(堆栈)的大小,即即每个线程可以使用的内存大小.

-Xms:堆的初始值.

-Xmx:堆能达到的最大值.

java内存模型中堆和栈的区别:

  管理方式:栈自动释放,堆需要GC处理

  空间大小:栈比堆小

  碎片相关:栈产生的碎片原小于堆

  空间的分配方式:栈支持静态和动态,而堆仅支持动态的分配方式

  效率:栈的效率比堆高

JVM的参数:

标准参数 -help -version -server -client,机器如果是64位操作系统的,则只有server模式

-X参数 非标准参数 eg -Xint  -Xcomp -mixed 分别是解释模式 编译模式 混合模式。

  -Xms和-Xmx分别表示初始堆内存大小和最大堆内存大小

  -Xmx2048m 等价于 -XX:MaxHeapSize   设置jvm最大堆内存为2018M 

  -Xms512m 等价于 -XX:initialHeapSize 设置jvm初始化堆内存512m

-XX参数 使用率较高 主要用于jvm调优和debug操作,eg:-XX:newSize -XX:useSerialGC 

  boollean参数:[+/-],+表示生效 -表示失效 非bollean参数:-XX:newRatio=1 表示新生代和老年代的比值

-D参数 设置系统属性,自定义参数

查看jvm运行参数:-XX:+PrintFlagsFinal

查看正在运行的jvm参数:需要使用jinfo命令查看 eg: jiofo -flags pid

通过jstat命令查看堆内存的使用情况:

  查看类的统计:jstat -class pid

  查看类编译统计:jstat -compiler pid

  查看垃圾的回收统计:jstat -gc pid 1000 5

jmap使用:

  查看堆内存配置及使用情况:jmap -heap 25834

  查询内存中的数量及大小:jmap -histo:live pid |more

  将内存的使用情况dump到文件中:jamp -dump:format=b,file=path pid

  使用jhat对dump文件经行分析:jhat -port 8888 path 也可以通过OQL语句查询 select s from java.lang.String  s where s.value.lengeh>1000

  开通防火墙:firewall-cmd --zone=public --add-port=8888/tcp --permanent;firewall-cmd --reload

可以使用MAT工具分析内内存溢出等问题 jstack pid

jvisualvm介绍:

该工具能够监控线程,内存情况,查看方法的cpu时间和内存中的对象,已被gc的对象,反向查看分配的堆栈,如100个Sting对象分别有那几个对象分配,jvisualvm使用简单,功能丰富,几乎包含了其他jdk自带命令的所有功能。

 

posted on 2021-08-26 22:25  永刚的点滴成长  阅读(41)  评论(0)    收藏  举报