Fork me on GitHub

JVM-07-监控和分析工具(命令行)

JVM-07-监控和分析工具(命令行)

前序

通过前面的几篇,我们介绍了Java虚拟机的内存分配以及内存回收等理论知识,了解这些知识对于我们在实际生产环境中提高系统的运行效率是有很大的帮助的。

但是话又说回来,在实际生产环境中,线上项目正在运行,我们怎么去监控虚拟机的运行效率呢?

又或者是线上项目发生了OOM,异常堆栈的信息,我们又怎么去抓取,然后去分析定位问题的呢?

本篇博客,我们就来介绍各种虚拟机监控和分析工具,当然都是命令行工具,不够直观,下篇博客我们会介绍各种可视化工具。

阅读更多...

JVM-06-内存分配

JVM-06-内存分配

前序

Java是自动进行内存管理的,所谓自动化就是,不需要程序员操心,Java会自动进行内存分配内存回收这两方面。

前面我们介绍过如何通过垃圾回收器来回收内存,那么这篇聊一聊如何进行内存分配。

  • 对象的分配,往大方向上讲,就是堆上进行分配(但是也有可能经过JIT编译后被差三位标量类型并间接在栈上分配)
  • 对象主要分配在新生代 Eden 区上,如果启动了本地线程分配缓冲,将按线程优先在 TLAB 上分配
  • 少数情况下也有可能直接分配在老年代上
  • 分配的规则并不是百分之百固定的,其细节取决于当前使用哪一种垃圾收集器组合,还有虚拟机中与内存相关的参数设置。

本篇会介绍几条最普遍的内存分配规则。通过增加 -XX:+UseParallelGC 参数,表示使用的垃圾收集器是 Parallel Scavenge + Serial Old ,通过这两个垃圾收集器组合进行校验。

阅读更多...

JVM-05-JVM参数

JVM-05-JVM参数

前序

详细参数配置:https://www.oracle.com/java/technologies/javase/vmoptions-jsp.html

​ JVM参数有很多,其实我们直接使用默认的JVM参数,不去修改都可以满足大多数情况。

​ 但如果在有限的硬件资源下,部署的系统达到最大的运行效率,那么进行相关的JVM参数设置是必不可少的。

​ 下面我们就来对这些JVM参数进行详细的介绍。

​ JVM参数主要分为以下几种(可以根据书写形式来区分):

1. 标准参数

mark

阅读更多...

JVM-04-垃圾收集器

JVM-04-垃圾收集器

前序

上一篇介绍了几种常用的垃圾回收算法,包括标记-清除,标记整理,复制等,这些算法我们可以看做是内存回收的理论方法,那么在Java虚拟机中,由谁来具体实现这些方法呢?

没错,就是本篇博客介绍的内容——垃圾收集器。

1. 垃圾收集器的种类

mark

由上图我们可以总结出几个结论:

阅读更多...

JVM-03-垃圾回收

JVM-03-垃圾回收

前序

如果对C++这门语言熟悉的人,再来看Java,就会发现这两者对垃圾(内存)回收的策略有很大的不同。

  • C++:垃圾回收很重要,我们必须要自己来回收!!!
  • Java:垃圾回收很重要,我们必须交给系统来帮我们完成!!!

我想这也能看出这两门语言设计者的心态吧,

总之,Java和C++之间有一堵由内存动态分布和垃圾回收技术所围成的高墙,墙外面的人想进去,墙里面的人想出来。

本篇我们就来详细介绍Java的垃圾回收策略。

阅读更多...

JVM-01-简介

JVM-01-简介

​ 本系列将以当前默认的主流虚拟机HotSpot 为例,详细介绍 Java虚拟机。以 JDK1.7 为主,同时介绍与 JDK1.8 的不同之处,通过Oracle官网以及各种文献进行整理,并加以验证,力求保证这块知识的正确性,完整性。

以下是本系列博客参考的相关文档:

  1. JDK规范
  • JDK1.7虚拟机规范

https://docs.oracle.com/javase/specs/jvms/se7/html/index.html

  • JDK1.8虚拟机规范

https://docs.oracle.com/javase/specs/jvms/se8/html/index.html

  1. 周志明老师:《深入理解Java虚拟机:JVM高级特性与最佳实践》
  1. 陈涛老师:《HotSpot实战》
  1. Oracle Java SE 8 产品组件 : https://docs.oracle.com/javase/8/docs/index.html
阅读更多...

Leetcode-1018-可被5整除的二进制前缀

Leetcode-1018-可被 5 整除的二进制前缀

题目描述

  • 给定由若干 0 和 1 组成的数组 A。我们定义 N_i:从 A[0] 到 A[i] 的第 i 个子数组被解释为一个二进制数(从最高有效位到最低有效位)。

  • 返回布尔值列表 answer,只有当 N_i 可以被 5 整除时,答案 answer[i] 为 true,否则为 false。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
示例 1:

输入:[0,1,1]
输出:[true,false,false]
解释:
输入数字为 0, 01, 011;也就是十进制中的 0, 1, 3 。只有第一个数可以被 5 整除,因此 answer[0] 为真。

示例 2:

输入:[1,1,1]
输出:[false,false,false]

示例 3:

输入:[0,1,1,1,1,1]
输出:[true,false,false,false,true,false]

示例 4:

输入:[1,1,1,0,1]
输出:[false,false,false,false,false

提示:

1 <= A.length <= 30000
A[i] 为 0 或 1
阅读更多...

云服务器-JDK配置

云服务器-JDK配置

1. JDK下载

2. JDK的安装

因为usr/lib目录下的操作是需要管理员权限的所以要在命令前加sudo

  • 确认 /usr/lib/目录下有jvm文件夹,如果没有用 sudo 权限创建 jvm文件夹(进入到该目录下,sudo mkdir jvm)
  • 将下载的文件解压到该目录下(命令:sudo tar zxvf ./jdk-8u161-linux-i586.tar.gz -C /usr/lib/jvm)

3. 配置环境变量

打开环境路径文件:sudo vi ~/.profile

添加如下的语句到文末:

1
2
3
4
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_161
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

source ~/.profile, 更新环境变量

4. 结果测试

输入 java -version,如果提示对应的java版本信息则安装成功

5.命令总结

1
2
3
4
5
6
7
8
9
sudo mkdir jvm
sudo tar zxvf ./jdk-8u161-linux-i586.tar.gz -C /usr/lib/jvm
sudo vi ~/.profile
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_161
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
source ~/.profile
java -version

6.可能出现的问题

  1. 程序 ‘java’ 已包含在下列软件包中:
    • default-jre
    • gcj-4.9-jre-headless
    • gcj-5-jre-headless
    • openjdk-8-jre-headless
    • gcj-4.8-jre-headless
    • openjdk-9-jre-headless
      请尝试:sudo apt install <选定的软件包>

** 解决方法:手动设置系统默认JDK**

1
2
3
4
5
sudo update-alternatives --install  /usr/bin/java   java  /usr/lib/jvm/jdk1.8.0_161/bin/java 300

sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.8.0_161/bin/javac 300

sudo update-alternatives --config java
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信