Java使用虚拟机的好处知乎_java虚拟机2(深入理解java虚拟机)

jvm的类加载机制:虚拟机将描述类的class文件转化至内存,并且对数据进行校验、转换解析和初始化,具体步骤有加载、验证、准备、解析和初始化:加载,将.class二进制读入内存并放入方法区,再创建一个java.lang.class对象将其数据结构封装进方法区运行时数据结构;验证,确保class文件字节流中包含的信息符合虚拟机的要求;准备,为静态变量分配内存并设置静态变量的默认值;解析,虚拟机将常量池符号引用替换成直接引用的过程;初始化,执行clinit()方法,执行静态变量赋予初始值和静态代码,父类先执行;

简述jvm类加载器和双亲委派机制:类加载器分成启动类加载器、扩展类加载器、应用程序类加载器和自定义类加载器;启动类加载器(jvm自带)负责将\lib目录或者-Xbootclasspath参事指定的路径中的类库加载至内存;扩展类加载器,负责加载\lib\ext目录下或者被java.ext.dirs系统变量指定的路径中的所有类库;应用程序类加载器,负责将用户类路径(classpath)上所指定的类库加载至内存;双亲委派机制:通常情况下除启动类加载器之外,其余类加载器均通过组合方式复用父加载器的代码,当一个类加载器收到类加载请求时,首先都会交给父加载器去执行(都会到达启动类加载器),只有父加载器反馈无法加载时,子加载器才会尝试加载。(比如自己写一个java.lang.Object类放至classpath,若没有双亲委派机制则会出现多个不同的Object类);

静态分派和动态分派:静态分派通过静态类型定位方法,在编译器发生,典型方法是方法的重载;动态分派依据实际类型确定方法,运行期发生,典型应用是方法的重写;

jvm启动模式client和server:1、通过-server和-client参数指定启动模式;2、区别:(1)、编译器方面:client模式下使用代号c1的轻量级编译器,server模式采用c2重量级编译器,编译的更加彻底,服务性能更高;(2)、gc:client模式均采用串行gc(新生代Serial,老年代Serial Old),server模式采用并行gc(新生代Parallel Scavenge,老年代Parallel Old);(3)、client模式启动快,编译快,内存占用少,优化客户端环境的启动时间,server模式启动慢、编译更完全、优化服务端环境的最大化程序执行速度;

如何优化java gc:GC优化方向:1、将进入老年代的对象数量降到最低;2、减少Full GC的执行时间。具体措施:优化jvm参数,堆内存大小、新生代\老年代内存大小之比、GC类型选择,修改参数并且在多台服务器上测试选择较好的;

JVM启动时启动的进程:1-main 主线程,执行我们指定的启动类的main方法;2-Reference Handler 处理引用的线程;3-Finalizer 调用对象的finalize方法的线程,就是垃圾回收的线程;4-Signal Dispatcher 分发处理发送给JVM信号的线程;5-Attach Listener 负责接收外部的命令的线程;Attach Listener :该线程是负责接收到外部的命令,执行该命令,并且把结果返回给发送者;signal dispather: 前面我们提到第一个Attach Listener线程的职责是接收外部jvm命令,当命令接收成功后,会交给signal dispather线程去进行分发到各个不同的模块处理命令,并且返回处理结果;Finalizer: JVM在垃圾收集时会将失去引用的对象包装成Finalizer对象(Reference的实现),并放入ReferenceQueue,由Finalizer线程来处理;Reference Handler :它主要用于处理引用对象本身(软引用、弱引用、虚引用)的垃圾回收问题;main:主线程,用于执行我们编写的java程序的main方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值