常见问题:
1、空间分配担保
名次解释
JNDI
(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端APISPI
全名为Service Provider Interface.这个是针对厂商或者插件的
参数分类
垃圾分代收集
https://www.cnblogs.com/zhguang/p/3257367.html
打开gc日志
https://blog.youkuaiyun.com/liuxiao723846/article/details/72701414
jinfo
https://www.cnblogs.com/NetKillWill/archive/2017/10/28/jinfo.html
标准参数
功能和输出的参数都是很稳定的 在未来的JVM版本中不会改变 可以使用java -help检索出所有的标准参数。
用法: java [-options] class [args...]
(执行类)
或 java [-options] -jar jarfile [args...]
(执行 jar 文件)
其中选项包括:
-d32 使用 32 位数据模型 (如果可用)
-d64 使用 64 位数据模型 (如果可用)
-server 选择 "server" VM
默认 VM 是 server,
因为您是在服务器类计算机上运行。
-cp <目录和 zip/jar 文件的类搜索路径>
-classpath <目录和 zip/jar 文件的类搜索路径>
用 : 分隔的目录, JAR 档案
和 ZIP 档案列表, 用于搜索类文件。
-D<名称>=<值>
设置系统属性
-verbose:[class|gc|jni]
启用详细输出
-version 输出产品版本并退出
-version:<值>
警告: 此功能已过时, 将在
未来发行版中删除。
需要指定的版本才能运行
-showversion 输出产品版本并继续
-jre-restrict-search | -no-jre-restrict-search
警告: 此功能已过时, 将在
未来发行版中删除。
在版本搜索中包括/排除用户专用 JRE
-? -help 输出此帮助消息
-X 输出非标准选项的帮助
-ea[:<packagename>...|:<classname>]
-enableassertions[:<packagename>...|:<classname>]
按指定的粒度启用断言
-da[:<packagename>...|:<classname>]
-disableassertions[:<packagename>...|:<classname>]
禁用具有指定粒度的断言
-esa | -enablesystemassertions
启用系统断言
-dsa | -disablesystemassertions
禁用系统断言
-agentlib:<libname>[=<选项>]
加载本机代理库 <libname>, 例如 -agentlib:hprof
另请参阅 -agentlib:jdwp=help 和 -agentlib:hprof=help
-agentpath:<pathname>[=<选项>]
按完整路径名加载本机代理库
-javaagent:<jarpath>[=<选项>]
加载 Java 编程语言代理, 请参阅 java.lang.instrument
-splash:<imagepath>
使用指定的图像显示启动屏幕
有关详细信息, 请参阅 http://www.oracle.com/technetwork/java/javase/documentation/index.html。
X 参数
非标准化参数 在未来的版本可能会改变 所有的参数都用-X开始 可以使用java -X检索 但是注意没有-Xcomp,执行命令 java -X -help可查看更多
-Xmixed 混合模式执行 (默认)
-Xint 仅解释模式执行
-Xbootclasspath:<用 : 分隔的目录和 zip/jar 文件>
设置搜索路径以引导类和资源
-Xbootclasspath/a:<用 : 分隔的目录和 zip/jar 文件>
附加在引导类路径末尾
-Xbootclasspath/p:<用 : 分隔的目录和 zip/jar 文件>
置于引导类路径之前
-Xdiag 显示附加诊断消息
-Xnoclassgc 禁用类垃圾收集
-Xincgc 启用增量垃圾收集
-Xloggc:<file> 将 GC 状态记录在文件中 (带时间戳)
-Xbatch 禁用后台编译
-Xms<size> 设置初始 Java 堆大小
-Xmx<size> 设置最大 Java 堆大小
-Xss<size> 设置 Java 线程堆栈大小
-Xprof 输出 cpu 配置文件数据
-Xfuture 启用最严格的检查, 预期将来的默认值
-Xrs 减少 Java/VM 对操作系统信号的使用 (请参阅文档)
-Xcheck:jni 对 JNI 函数执行其他检查
-Xshare:off 不尝试使用共享类数据
-Xshare:auto 在可能的情况下使用共享类数据 (默认)
-Xshare:on 要求使用共享类数据, 否则将失败。
-XshowSettings 显示所有设置并继续
-XshowSettings:all
显示所有设置并继续
-XshowSettings:vm 显示所有与 vm 相关的设置并继续
-XshowSettings:properties
显示所有属性设置并继续
-XshowSettings:locale
显示所有与区域设置相关的设置并继续
-X 选项是非标准选项, 如有更改, 恕不另行通知。
以下选项为 Mac OS X 特定的选项:
-XstartOnFirstThread
在第一个 (AppKit) 线程上运行 main() 方法
-Xdock:name=<应用程序名称>"
覆盖停靠栏中显示的默认应用程序名称
-Xdock:icon=<图标文件的路径>
覆盖停靠栏中显示的默认图标
XX参数
非标准 很长一段时间不会列出来 用于JVM开发的debug和调优
虚拟机设置参数
参数 | 描述 |
---|---|
-client | 设置JVM使用client模式,特点启动较快(神机不明显(I5/8G/SSD)) |
-server | 设置JVM使用server模式。64位JDK默认启动该模式 |
-agentlib:libname[=options] | 用于加载本地的lib |
-agentlib:hprof | 用于获取JVM的运行情况 |
-agentpath:pathnamep[=options] | 加载制定路径的本地库 |
-Dproperty=value | 设置系统属性名/值对 |
-jar | 制定以jar包的形式执行一个应用程序 |
-javaagent:jarpath[=options] | 实现premain方法在main方法前执行可以利用该方式玩一个JVM层面的hook很有意思的东西 |
-verbose:jni | 输出native方法的调用情况玩JNI必备技能 |
verbose:jni, 输出native方法的调用情况玩JNI必备技能, 例如:
-agentlib:jprofilerti=port=8849 -Xbootclasspath/a:/usr/local/jprofiler5/bin/agent.jar
java堆栈大小设置相关
参数 | 描述 |
---|---|
-Xms | 设置初始 Java 堆大小 |
-Xmx | 设置最大的java堆大小 |
-Xmn | 设置Young区大小 |
-Xss | 设置java线程堆栈大小 |
-Xoss | 设置本地方法栈大小 |
-Dproject.name=${admin-web} | 指定工程名称 |
-XX:PermSize and MaxPermSize | 设置持久带的大小 |
-XX:NewRatio | 设置年轻代和老年代的比值 |
-XX:NewSize | 设置年轻代的大小 |
-XX:SurvivorRation=n | 设置年轻代中E去与俩个S去的比值 |
-XX:PermSize=128m | 设置永久代内存大小(JDK7之前有效) |
-XX:MaxPermSize=128m | 设置永久代最大内存大小(JDK7之前有效) |
其中老年代的大小是:Xms-Xmn
打印垃圾回收信息及设置垃圾回收器
参数 | 描述 |
---|---|
-verbose:gc | 记录GC运行以及运行时间,一般用来查看GC是否有瓶颈 |
-XX:+PrintGCDetails | 记录GC运行时的详细数据信息,包括新生占用的内存大小及消耗时间 |
-XX:-PrintGCTimeStamps | 打印收集的时间戳 |
-XX:+UseParallelGC | 使用并行垃圾收集器 |
-XX:ParallelGCThreads=N, | 设置并行垃圾回收的线程数,此值可以设置与机器处理机数量一致(有建议core+3/4); |
-XX:-UseConcMarkSweepGC | 使用并发标志扫描收集器 |
-XX:-UseSerialGC | 使用串行垃圾收集器 |
-Xloggc:filename | 设置GC记录的文件 |
-XX:+UseGCLogFileRotation | 启用GC日志文件的自动转储 |
-XX:GCLogFileSize=1M | 控制GC日志文件的大小 |
-XX:+UseAdaptiveSizePolicy | 设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。 |
-XX:GCTimeRatio=n | 设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n) |
-XX:+UseCMSCompactAtFullCollectio | 使用并发收集器时,开启对年老代的压缩。 |
-XX:CMSFullGCsBeforeCompaction=0 | 上面配置开启的情况下,这里设置多少次Full GC后,对年老代进行压缩 |
-XX:+PrintGCApplicationConcurrentTime | 打印每次垃圾回收前,程序未中断的执行时间。可与上面混合使用输出形式:Application time: 0.5291524 seconds |
-XX:+PrintGCApplicationStoppedTim | 打印垃圾回收期间程序暂停的时间。可与上面混合使用,输出形式:Total time for which application threads were stopped: 0.0468229 seconds |
-XX:PrintHeapAtGC | 打印GC前后的详细堆栈信息 |
调试参数
-Xdebug
-Xnoagent
-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000
-XX:HeapDumpPath=./java_pid.hprof :Path to directory or file name for heap dump.
-XX:-PrintConcurrentLocks :Print java.util.concurrent locks in Ctrl-Break thread dump.
-XX:-PrintCommandLineFlags :Print flags that appeared on the command line.
关于性能
-Xprof
-Xrunhprof
类加载和跟踪类加载和卸载的信息
Xbootclasspath :指定需要加载,但不想通过校验类路径。
JVM会对所有的类在加载前进行校验并为每个类通过一个int数值来应用
-XX:+TraceClassLoading :跟踪类加载的信息(诊断内存泄露很有用)
-XX:+TraceClassUnloading :跟踪类卸载的信息(诊断内存泄露很有用)
JVM调优工具Jconsole,jProfile,VisualVM
Jconsole :JDK自带,功能简单,但是可以在系统有一定负荷的情况下使用。对垃圾回收算法有很详细的跟踪。
JProfiler:商业软件,需要付费。功能强大。
VisualVM:JDK自带,功能强大,与JProfiler类似。推荐
实战OOM异常
1、堆溢出
指定虚拟机参数,-XX:+HeapDumpOnOutOfMemoryError可以dump出当前的内存堆转储快找
-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
public class ThreadState {
public static void main(String[] args){
List<ThreadState> list = new ArrayList<>();
while (true) {
list.add(new ThreadState());
}
}
}
参考文档
https://blog.youkuaiyun.com/Thousa_Ho/article/details/77278656
https://docs.oracle.com/javacomponents/jrockit-hotspot/migration-guide/cloptions.htm#JRHMG129