Hi,运维,你懂Java吗-No.3:java系统的启动

news2025/2/23 13:00:53

        作为运维,你不一定要会写Java代码,但是一定要懂Java在生产跑起来之后的各种机制。

        本文为《Hi,运维,你懂Java吗》系列文章 第三篇,敬请关注后续系列文章

        欢迎关注  龙叔运维(公众号)  持续分享运维经验

前言

        本篇对生产中运行java系统的启动方式以及启动参数以及相关配置进行介绍。

1、java应用的启动管理

        一般公司运行java系统,不管是打包成镜像发布(镜像部署),还是在服务器上替换程序包发布(包部署),都会有一个启动脚本(如起名叫start.sh),启动脚本负责维护java的启停以及启动的各种配置参数维护。

        启动脚本一般都会包含启动(start)、停止(stop)、重启(restart)三个基本功能。

       本文提供一个简单的脚本作为例子:

#!/bin/bash

APP_NAME=test.jar

#提示输入参数
use_help() {
    echo "Usage: sh demo.sh [start|stop|restart|status]"
    exit 1
}

#检查程序是否在运行
is_run() {
    pid=`ps -ef | grep $APP_NAME | grep -v grep | grep -v start.sh | awk '{print $2}' `
    #如果不存在返回1,存在返回0
    if [ -z "${pid}" ]; then
      return 1
    else
      return 0
    fi
}

#启动方法
start() {
   is_run
   if [ $? -eq "0" ]; then
     echo "${APP_NAME} is already running. pid=${pid} ."
   else
     java -Xms8192m -Xmx8192m  -XX:NewSize=1024m -XX:MaxNewSize=1024m -XX:PermSize=1024m -XX:MaxPermSize=4096m -XX:+UseG1GC -jar $APP_NAME 1>> log.log 2>&1 &
   fi
}

#停止方法
stop() {
   is_exist
   if [ $? -eq "0" ]; then
     echo "$pid"
     kill -9 $pid
   else
     echo "${APP_NAME} is not running"
   fi
}

#输出运行状态
status() {
   is_exist
   if [ $? -eq "0" ]; then
     echo "${APP_NAME} is running. Pid is ${pid}"
   else
     echo "${APP_NAME} is not running."
   fi
}

#重启
restart() {
   echo "stop the old process"
   stop
   echo "finish"
   echo "start the new process"
   start
   echo "finish"
}

#根据输入参数,选择执行对应方法
case "$1" in
   "start")
     start
     ;;
   "stop")
     stop
     ;;
   "status")
     status
     ;;
   "restart")
     restart
     ;;
   *)
     usage
     ;;
esac

        

        然而,这个脚本只是最基本的脚本,还可以有很多优化的地方,例如:

        A、增加环境检查(java环境等等)

        B、将用到的环境变量单独一个文件,然后在最开始的时候source这个文件,就可以在脚本中使用这些环境变量,维护更清晰

        C、JAVA启动参数可以加的更多,不同类型的启动参数可以分别用变量去指定,最后再java命令中合并到一起,如:

JAVA_OPTS_JVM="-Xms1024m -Xmx2048m -Xss256K"

JAVA_OPTS_GC="-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintHeapAtGC -Xloggc:logs/gc.log"

java ${jvm_options} ${JAVA_OPTS_GC} -jar  -jar aaa.jar 1>> log.log 2>&1 &

2、java应用的启动参数

        这里讲的就是java程序的启动命令java的一些在生产运行中可以用到的一些参数(所以这里并不是介绍所有参数哈)

        这里的一些参数所关联的如JVM,GC等知识点的更深入的介绍会在后续专门对应的章节介绍。

        本文只讲JAVA 1.8版本之后(所以不存在持久代)

2.1、JVM内存相关

       

a、-Xms & -XX:InitialHeapSize

        初始堆大小

-Xms1560M

-XX:InitialHeapSize=1560M

        默认值为物理内存的1/64(<1GB),建议初始堆大小和最大堆大小保持一致,以避免每次垃圾回收完成后JVM重新分配内存。

        默认空余堆内存小于40%(MinHeapFreeRatio参数可以调整)时,JVM就会增大堆直到-Xmx的最大限制.

        至于设置多大比较合适,这个其实要根据程序情况来看,但是一般可以直接配置为物理内存的1/4。

b、-Xmx &  -XX:MaxHeapSize

        最大堆大小

-Xmx1560M

-XX:MaxHeapSize=1560M

        默认值为物理内存的1/4(<1GB),建议初始堆大小和最大堆大小保持一致,以避免每次垃圾回收完成后JVM重新分配内存。

        默认空余堆内存大于70%(MaxHeapFreeRatio参数可以调整)时,JVM会减少堆直到 -Xms的最小限制

        至于设置多大比较合适,这个其实要根据程序情况来看,但是一般可以直接配置为物理内存的1/4。

c、-Xss & -XX:ThreadStackSize

        规定了每个线程虚拟机栈及堆栈的大小

-Xss256K

-XX:ThreadStackSize=256K

        一般情况下,256k是足够的,此配置将会影响此进程中并发线程数的大小。

        

d、-XX:NewSize

        设置年轻代的初始大小

-XX:NewSize=1G

       

e、-XX:MaxNewSize

        设置年轻代的最大大小

-XX:MaxNewSize=1G

       

f、-Xmn 

        同事设置年轻代的初始大小和最大大小

-Xmn1G

        整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。

g、-XX:NewRatio

        新生代(Eden + 2*S)与老年代(不包括永久区)的比值

        注意:设置了-Xmn,则-XX:NewRatio将被忽略

-XX:NewRatio=4

        例如-XX:NewRatio=4 表示新生代:老年代 = 1:4 即老年代占整个对的4/5;默认值=2。

        一般情况下,不允许-XX:Newratio值小于1,即Old要比Yong大。

h、-XX:SurvivorRatio

        2个Survivor区和Eden区的比值

-XX:SurvivorRatio=8

        例如:-XX:SurvivorRatio=8 表示 两个Survivor区:Eden区=2:8 ,每个Survivor占 1/10 ;JVM默认=8

i、-XX:MetaspaceSize

        元空间初始大小

-XX:MetaspaceSize=512M

        建议和-XX:MaxMetaspaceSize设置成一样大

j、-XX:MaxMetaspaceSize

        元空间最大大小        

-XX:MaxMetaspaceSize=512M

        建议和-XX:MaxMetaspaceSize设置成一样大

        建议最好设置上,因为和java8之前的永久代不一样,元空间是基于操作系统内存的,可以一直扩展到操作系统的极限。

k、-XX:MaxTenuringThreshold

        垃圾的最大年龄. 默认为15

XX:MaxTenuringThreshold=15

        新生代的From 区和To区 会来回的复制和交换位置. 每交换一次,就会增加一次年龄. 如果某些对象在 的年龄达到改参数配置的值, 就会从新生代到老年代中去.

        

l、-XX:MaxDirectMemorySize

        堆外内存大小,JVM之外分配的内存

XX:MaxDirectMemorySize=2G

        要避免-Xmx + MaxDirectMemorySize 大于物理内存

        这一块虚拟地址空间并不是分配在jvm堆上,而是分配在native堆上。yong gc不能回收这部分空间,只能通过Full gc顺带进行回收

m、-XX:+AlwaysPreTouch

        在服务启动的时候真实的分配物理内存给JVM

        可以加快代码运行效率,但是毕竟把分配物理内存的事提前放到JVM进程启动时做了,自然就会影响JVM进程的启动时间,导致启动时间变长。

        顺便提一下,可以用 jmap -heap 【PID】 查看java 进程堆相关的配置,看是否按照自己的配置分配了内存

2.2、GC设置相关

a、-XX:+PrintGCDetails

        打印 gc 详细信息日志

b、-XX:+PrintGC

        打印 gc 简单信息日志

c、-XX:+PrintGCDateStamps

        输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)

d、-XX:+PrintTenuringDistribution

        JVM在每次新生代GC时,打印出幸存区中对象的年龄分布。

e、-XX:+PrintHeapAtGC

        在进行GC的前后打印出堆的信息

f、-Xloggc

        指定GC日志文件

-Xloggc:/var/logs/gc.log

f、-XX:+DisableExplicitGC

        禁止显示调用GC,代码中手动调用System.gc()就不会生效。

        而有些框架中因为是使用的堆外内存,必须手动调用System.gc()来释放。如果禁用掉就会导致堆外内存使用一直增长,造成内存泄露。

2.3、程序运行记录相关

a、-XX:+HeapDumpOnOutOfMemoryError

        当JVM发生OOM时,自动生成DUMP文件

b、-XX:HeapDumpPath

        自动生成的DUMP文件路径

-XX:HeapDumpPath=/var/logs/oom.hprof

c、-XX:ErrorFile

        应用程序中的错误而发生崩溃时生成日志文件

        默认这个文件创建在工作路径下的hs_err_pid.log中

-XX:ErrorFile=/var/logs/hs_err_%p.log"

d、-XX:+PrintFlagsInitial 

        印所有的默认参数设置

e、-XX:+PrintFlagsFinal

        打印最终值,如果某个默认值被新值覆盖,显示新值

f、-XX:+PrintCommandLineFlags 

        打印那些被新值覆盖的项

本篇结束 欢迎关注该系列后续文章,更多更深入的一些参数会在对应知识点的时候一并讲解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/25574.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅谈一下:Java学习中不得不知道的:static (静态)成员

下面笔者&#xff0c;按照之前的Student进行简单的说明&#xff1a; class Student {private String name ;private int age ;private String classRoom ;//上课教室public Student(String name, int age) {this.name name;this.age age;}public void doClass() {System.out…

五、 通信协议

协议&#xff1a;约定&#xff0c;就好比我们来自不同的地方&#xff0c;如果都用各自的家乡话&#xff0c;那么肯定无法沟通&#xff0c;这时我们规定双方都说普通话&#xff0c;这样就可以沟通了&#xff0c;而这个规定就是“协议” 网络通信协议&#xff1a;速率、传输码率…

SpringCloud - 服务注册中心

文章目录1.服务注册中心2.Eureak服务注册中心2.1 Eureka服务注册与发现2.1.1 单机Eurake构建步骤(1) 创建EurekaServer服务注册中心(2) EurekaClient服务注册2.1.2 Eureka集群构建步骤(1) 创建第多个EureakServer注册中心(2) 修改host(模拟)(3) 修改YML配置2.1.3 集群配置Eurek…

搞定企业视频直播:硬件设备、直播网络环境和设备连接说明

阿酷TONY / 2022-11-22 / 原创 / 长沙 / 1.直播硬件设备 电脑硬件推荐配置&#xff1a; 系统&#xff1a;win7系统以上&#xff0c;macOS 10.13.6以上 显卡&#xff1a;独立2G显卡或以上 CPU&#xff1a;i5或以上 内存&#xff1a;4G或以上 选配硬件&#xff1a; …

我有 7种 实现web实时消息推送的方案,7种!

技术交流&#xff0c;公众号&#xff1a;程序员小富 大家好&#xff0c;我是小富&#xff5e; 我有一个朋友&#xff5e; 做了一个小破站&#xff0c;现在要实现一个站内信web消息推送的功能&#xff0c;对&#xff0c;就是下图这个小红点&#xff0c;一个很常用的功能。 不过…

打印机不能正常打印怎么办

第一种&#xff1a;更换驱动&#xff0c;在官网上下载相应的驱动而后安装 第一步&#xff1a;添加打印机和扫描仪 第二步&#xff1a;点击——>我需要的打印机不在列表中 第三步;①如果是USB连接则选择添加本地打印机 ②如果是网络打印机&#xff0c;则选择使用TCP/IP添加…

kubernetes 安装与部署

kubernetes 安装与部署 环境almalinux,centos,rockylinux,redhat的9.1版本使用containerd容器运行时kubernetes v1.25.4root用户 1.设置主机名 2.禁用防火墙 3.禁用selinux 4.禁用swap 5.同步时间 5.桥接流量 6.安装nerdctl-full 7.确认cgroup驱动默认为systemd 8.安装kubead…

Intel MediaSDK sample_decode 官方GPU解码流程学习(一) - DirectX11 D3D11和Vulkan共享资源

很久以前研究过 用NV_DX_interop扩展让D3D和OpenGL共享资源 &#xff0c; OpenGL在当初设计的时候电脑和操作系统还是个相对比较简单的东西&#xff0c;因此OpenGL API设计没有考虑到现在计算机架构的一些特性&#xff0c;比如多核编程和多显卡并发。最近几年出来个Vulkan来接O…

Androguard Documentation:官方文档阅读笔记

打算快速阅读下官方文档&#xff0c;然后做一个笔记方便查阅&#xff0c;文章目录按照官方文档目录来的 DOCUMENTATION Getting Started 使用 androguard axml和androguard arsc解码分析AndroidManifest.xml或者resources.arsc。 创建call graphs可以使用androguard cg&…

快消品b2b电子商务网站建设方案

互联网在改造电商行业商业运作模式和提升运营效率作用方面功不可没&#xff0c;目前B2B电商发展正处在交易上升期特别是B2B快消品电商&#xff0c;这个以万亿为单位的流通规模市场必将掀起巨大的社会价值和运营效率。当然在讨论快消品流通B2B电商行业之前&#xff0c;我们先简单…

C++语言的return语句的一点说明

C语言的return语句的一点说明 为了完成某一功能的程序指令&#xff08;语句&#xff09;的集合&#xff0c;称为函数。在程序中&#xff0c;编写函数的主要目的是将一个需要很多行代码的复杂问题分解为一系列简单的任务来解决&#xff0c;而且&#xff0c;同一个任务&#xff0…

程序员副业之无货源闲鱼

我将从以下这些方面来介绍闲鱼副业。 1. 闲鱼平台能不能挣钱? 2. 闲鱼平台都有哪几种挣钱方式&#xff1f; 3. 小白在闲鱼上怎么挣钱&#xff1f; 4. 能挣多少&#xff1f; 5. 如何养号&#xff1f; 6. 得到高权重的账号闲鱼上架该选什么商品&#xff1f; 7. 卖…

城市消费券,拒绝恶意爬取

作为提振经济的重要把手&#xff0c;城市消费券的作用不言而喻。公开数据显示&#xff0c;2022 年全国各地公布的消费券累计超 100 万亿&#xff0c;在撬动各地消费的过程中起到了举足轻重的作用。 然而&#xff0c;仔细分析各地的核销率就会发现&#xff0c;有很大一部分消费…

Zookeeper系列文章—入门

目录 前言 测试 创建节点 更改节点 删除节点 前言 遵照前文已经对Zookeeper进行了安装 linux安装Zookeeper3.5.7详解_兜兜转转m的博客-CSDN博客 接下来我们从整体架构方面了解一下Zookeeper&#xff1a; ZooKeeper 是一个树形目录服务,其数据模型和Unix的文件系统目录树很类…

安装完Vmware-tools后找不到共享文件夹的解决办法-Ubuntu 18有效

首先确认VMware-tools安装好了 如果VMware-tools一直灰色&#xff0c;可以根据这篇文章的方式解决&#xff1a;解决VMware Tools灰色的方法 设置共享文件夹 如果找不到共享文件夹&#xff0c;可以先尝试这个方法&#xff1a;共享文件夹设置方式 特殊情况解决方法 在VMware…

Java:阻塞队列BlockingQueue与应用场景

目录 阻塞队列 BlockingQueue的常用方法 生产者消费者应用场景 阻塞队列 阻塞队列BlockingQueue继承自父类Queue&#xff0c;该队列是线程安全的&#xff0c;可以安全的与多个生产者和消费者线程一起使用。 与阻塞队列相对的&#xff0c;存在“非阻塞队列”的概念&#xff0c…

Python采集某购物软件数据信息,轻松拿捏千元外包项目

前言 嗨嗨&#xff0c;想必知道外包这个词的人应该不少吧 话说&#xff0c;接外包有多的也有少的&#xff0c;少的几十&#xff0c;多的emm上限我就不说了&#xff0c;嘿嘿 今天要不要来看看一个千元的外包项目&#xff1f; 是采集某购物软件的一些数据信息 咋说&#xff…

Excel常用图表,看看哪个还不会?

图表是指可以直接展示数据关于时间、数量等关系&#xff0c;对知识挖掘和信息直观生动感起关键作用的图形结果&#xff0c;是对数据关系进行形象“可视化”的手段。所以将数据转换为图表能使数据更为直观。 常见图表 Excel为用户提供了10几种图表&#xff0c;包括柱形图、折线…

【网安神器篇】——Crunch字典生成工具

作者名&#xff1a;Demo不是emo 主页面链接&#xff1a;主页传送门 创作初心&#xff1a;舞台再大&#xff0c;你不上台&#xff0c;永远是观众&#xff0c;没人会关心你努不努力&#xff0c;摔的痛不痛&#xff0c;他们只会看你最后站在什么位置&#xff0c;然后羡慕或鄙夷座…

小啊呜产品读书笔记001:《邱岳的产品手记-07》第13讲 无用却必要:产品规划【上】 第14讲 留白与节奏:产品规划【下】

小啊呜产品读书笔记001&#xff1a;《邱岳的产品手记-07》第13讲 无用却必要&#xff1a;产品规划【上】 & 第14讲 留白与节奏&#xff1a;产品规划【下】一、今日阅读计划二、泛读&知识摘录1、第13讲 无用却必要&#xff1a;产品规划【上】2、第14讲 留白与节奏&#…