Java SE API know how-类加载和随机数
迪丽瓦拉
2025-06-01 00:20:01
0

Java SE API know how

类加载

对于任何在动态系统中优化程序启动速度或者代码部署速度,类加载都是本质瓶颈

类数据(Java字节码)通常不能被快速访问。

该数据必须从磁盘或者网络加载,必须能在类路径上的某个jar文件中找到

必须能在某个类加载器中找到

JDK11对于类加载的提升

类数据共享 (class data sharing) CDS

是JVM之间共享类元数据的一种机制,当机器运行多个jvm,对内存有帮助

通常每个jvm都有自己的类元数据,如果该元数据是共享,只需要在内存中保留一份副本

  • 在jdk11中CDS所有平台可用,因为没有默认元数据的共享存档,并不是开机即用
  • CDS可以用在任何类集上,无论是哪个类加载器加载,无论是来源于哪个jar
  • CDS只适用于从模块或jar文件加载的类,不能共享来自文件系统或者网络URL的类
  • CDS的两种类型,常规的,共享默认JDK类和应用程序数据共享

加快类加载速度的最佳方法是为应用程序创建一个类数据共享存档,不需要修改代码。

随机数

Random类nextGaussian方法是同步,多线程会阻塞

ThreadLocalRandom 单独线程版本,每个线程有自己的生成器,排除同步问题

实现典型的伪随机算法,算法具有确定性,如果确认种子则可确定该引擎生成的数列

SecureRandom

通过一个系统接口为随机数获取种子

该数据的生成方式和操作系统相关,并且基于真正的随机事件,基于熵的随机性(entropy-based randomness)

Java区分两个随机数源:生成种子和生成随机数

在Linux系统上

/dev/random

是一个阻塞设备,系统熵池中随机数不足读取会阻塞,直到系统熵池中的随机数足够

/dev/urandom

不会阻塞读取操作

cat /proc/sys/kernel/random/write_wakeup_threshold

显示linux系统内核随机生成器的写入唤醒值

通过配置java安全随机数生成器获取种子和随机数

1.Djava.security.egd=file:/dev/urandom

2.在jdk配置中修改

/jdk/conf/security/java.security中修改,默认已经修改linux系统配置

在这里插入图片描述

java.policy基于java安全模型的规则,可根据本地需求进行修改

代码来源:可执行代码和作用域

代码签名:需要数字签名的代码和作用域

权限设置:代码执行权限,访问本地文件和网络

类加载:规定哪些类可以被加载和执行,并且控制加载行为

安全管理器:规定自定义安全管理器行为

相关内容