背景

在看深入理解Java虚拟机(第2版)第二章的内容时,内存溢出在不同JDK版本下会有不同的表现,想测试不同JDK版本下,内存溢出的效果。

操作

在IDE中写对应内存溢出的代码,添加JVM参数,运行成功。

使用不同JDK版本时,如果每次都需要修改IDE环境较为繁琐,所以想通过命令行的方式来指定JDK版本。

然而

[Could not find or load main class](https://huati.weibo.com/k/Could+not+find+or+load+main+class?from=501)

排错

  • 文件本身错误
    • 在IDE内运行成功,排除
  • 命令行使用方式错误
    • 检查命令行有无拼写错误或参数错误,排除
    • Windows命令行环境下运行成功,排除
  • 环境变量错误

下载

安装包(注意都是下载mac下的dmg安装包):

JDK 1.6

JDK 1.7&1.8&1.9(早期版本在页面下方)

配置

关于Mac系统的环境变量文件入门介绍,可参考Linux环境变量文件

修改配置文件

  • vi ~/.bash_profile
1
2
3
4
5
6
7
8
9
10
11
12
#配置版本
export JAVA_6_HOME=`/usr/libexec/java_home -v 1.6`
export JAVA_7_HOME=`/usr/libexec/java_home -v 1.7`
export JAVA_8_HOME=`/usr/libexec/java_home -v 1.8`
#配置JAVA_HOME
export JAVA_HOME=`/usr/libexec/java_home`
#配置PATH
export PATH="$JAVA_HOME:$PATH"
#alias命令动态切换JDK版本
alias jdk6="export JAVA_HOME=$JAVA_6_HOME"
alias jdk7="export JAVA_HOME=$JAVA_7_HOME"
alias jdk8="export JAVA_HOME=$JAVA_8_HOME"
  • source ~/.bash_profile
  • 通过命令行输入jdk6jdk7jdk8jdk9可以快速切换版本

Mac切换JDK版本

补充

不建议

  • 根据苹果的官方说明,Mac OS X 10.5 及以后的版本应该使用 /usr/libexec/java_home 命令来确定 JAVA_HOME。
  • 版本发生变化需要修改配置
  • 无法适应不同的Java实现(Apple、Oracle、OpenJDk)

关于JDK路径

  • 终端输入执行:which java,显示/usr/bin/java
  • 执行cd /usr/bin/,再执行ls -l |grep java,可看到java此命令是link到/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
  • 执行:cd /System/Library/Frameworks/JavaVM.framework/Versions/进入后,再执行ls -l,可看到Current -> A,也就是Current目录link到A目录。而A目录在安装第一个JDK时就存在,用来JDK多版本管理使用的。

/System/Library/Frameworks/JavaVM.framework/Versions/ 下有多个不同(低)版本的目录,但它们链接的都是 CurrentJDK 目录。总之,这些Java都是苹果提供的Java,Oracle 或 OpenJDK 提供的 Java 不在此目录中。

小插曲

取消了/etc/profile~/.bash_profile两个文件中,对JAVA_HOME添加到PATH的语句后,输入java -version依旧出现版本信息。经查验,是因为在/usr/bin中存在java

所有用户皆可用的系统程序放在/bin

超级用户才能使用的系统程序放在/sbin

所有用户都可用的应用程序放在/usr/bin

超级用户才能使用的应用程序放在/usr/sbin

所有用户都可用的与本地机器无关的程序存放在/usr/local/bin

更多文件系统说明,可在terminal中输入man hier查看文件系统层次说明。


  • 编辑文件时,如需要整行移动
    • 通过dd当前行,在合适的地方p
    • :5 move 2
    • map快捷键
    • 安装插件vim-unimpaired
      • 装好后按[e或者]e这两个快捷键移动当前行到上面或者下面

阅读资料

PATH and CLASSPATH

Linux文件系统中/bin、/sbin、/usr/bin、/usr/sbin、/usr/local/bin、/usr/local/sbin文件夹的区别是什么?

Mac 上 java 究竟在哪里,本文彻底让你搞清楚!