JVM、maven、Nexus

一、jvm简介

1.应用程序申请内存时出现的三种情况:

①OOM:内存溢出,是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。此时程序就运行不了,系统会提示内存溢出,有时候会自动关闭软件,重启电脑或者软件后释放掉一部分内存又可以正常运行该软件,而由系统配置、数据流、用户代码等原因而导致的内存溢出错误,即使用户重新执行任务依然无法避免

② Memory Leak:内存泄漏,是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

③内存抖动:指在短时间内有大量的对象被创建或者被回收的现象

黄色模块规定:内存不能超过32G,黄色区域都调用的是jdk底层的内存区域,每个应用模块都占用独立的JVM

 2.JVM组成区

 流程:首先所有的类文件.class,基于类加载子系统(class loader subsystem)中的类加载器,

将多个类封装继承起来,放到内部来申请内存进行交换;基于类加载子系统在通过执行引擎来处理它的内存空间(runtime data Areas :JVM的内存区域)

执行引擎: 包括JIT (JustInTimeCompiler)即时编译器,动态编译的一个类, GC垃圾回收器

本地方法接口(Native method Interface): 将本地方法栈通过JNI(Java Native Interface)调用Native Method Libraries,比

如C,C++库等,扩展Java功能,融合不同的编程语言为Java所用

3.JVM运行时数据区域

本地方法区method Area(线程共享,JDK8以后叫元空间):线程共享。存放类、常量、静态变量等。

heap(堆):线程共享。堆在虚拟机启动时创建,存放创建的所有对象信息,存放较大资源,具体对象。若对象无法申请将抛OOM异常,通过GC垃圾回收器进行管理。通过-Xmx -Xms 指定最大堆和最小堆空间大小,是JVM内存中最大的区域

Java stack:线程私有,每个线程分配一个栈。存放java8大基本数据类型对象引用,实例的本地变量。

程序计数器(PC寄存器):线程私有,指针,指向某个线程。

本地方法栈:线程私有,非JAVA的一些库。

4.GC垃圾回收器

        ①引用计数器,引用值为0。(Python)  a=100

        当pc计数器为0的时候,就清理垃圾

        特殊:不会外部程序引用的对象,但不同的方法也在互相引用,这也需被清掉

        ②Java   根可达算法,找不到的资源为垃圾

5.垃圾回收算法

①:标记清除算法(年轻代)

红色:垃圾      绿色:被使用的内存            灰色:没被使用的内存

弊端:效率高,但是容易出现内存碎片,导致系统内存利用率不高

②:标记压缩算法(老年代)

        标记整理法就是将内存中存活的对象往一端移动,然后再将端边界以外的对象清除掉。

③:复制算法(幸存者区)

        将内存区域分为两个大小相等的两块,每次只使用其中的一块,当一块用完了之后,便将这块的存活对象复制到另外一块上面,然后一次性将用完的那块 内存数据清除掉。复制算法的过程

优缺点:

效率   复制>清除>压缩

内存整齐度:复制=压缩>清除

内存利用率:压缩=清除>复制

6.jvm垃圾回收详解

STW:stop the world   JVM内存回收,垃圾回收时会停止,出现卡顿。

堆内存分代本地方法区(永久代)  年轻代    老年代

年轻代:伊园区(默认8份)(标记清除算法)      幸存区(from---s0    to --- s1)  默认共2份(复制算法)

老年代:默认20份(标记压缩算法)

【注】:幸存者空间,必须留一半空间,用来存放伊甸园区的不是垃圾的数据

总结:起始时。所有新建对象(特大对象直接进入老年代)都出生再eden,启动GC

      2:先标记eden存活对象,然后将存活对象复制到s0(假设本次是s0,也可以是s1,它们可以调换),eden剩余所有空间都清空。GC完成

      3:继续新建对象,当eden再次满了,启动GC

      4:先同时标记eden和s0中存活对象,然后将存活对象复制到s1。将eden和s0清空,此次GC完成

      5:继续新建对象,当eden满了,启动GC

      6:先标记eden和S1中存活对象,然后将存活对象复制到s0。将eden和s1清空,此次GC完成。

      以后就重复上面的步骤

优化参数:

vim /usr/local/tomcat/bin/catalina.sh  //编辑配置文件
在空白区域编写 CATALINA_OPTS="-server -Xms1g -Xmx1g "

Xmx堆内存最大使用空间(默认为1/4,最大为默认系统可用内存)

Xms堆内存初始内存(默认为1/64)

【注】:jvm内存建议不要超过32G,否则效率急剧下降

-XX:NewSize     设置新生代大小

-XX:MaxNewSize  设置最大新生代内存大小

-Xmn2g设置年轻代大小为2G。在整个堆内存大小确定的情况下,增大年轻代将会减小老年代,反之亦然。此值关系到JVM垃圾回收,对系统性能影响较大,推荐配置为整个堆大小的3/8。推荐年轻代大小要小于老年代。

-Xss128k设置每个线程的栈大小。默认每个线程栈大小为1M。应当根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。需要注意的是:当这个值被设置的较大(例如>2MB)时将会在很大程度上降低系统的性能

-XX:PermSize     非堆内存初始值,默认是物理内存的1/64

-XX:MaxPermSize  最大非堆内存的大小,默认是物理内存的1/4

https://baijiahao.baidu.com/s?id=1681394166244104299&wfr=spider&for=pc

JAVA内存设置

查看java中jvm内存区域的详细大小

java -XX:+PrintGCDetails heap   或者java -Xlog:gc* heap

案例:实现指定jvm堆内存空间、gc垃圾回收过程和OOM错误

javac -cp . heapoom.java    

java -Xms100m -Xmx100m -XX:+PrintGCDetails -cp . heapoom

java -Xms500m -Xmx500m -XX:+PrintGCDetails -cp . heap

 二、java程序编译

1.maven 部署准备

①:maven 介绍

Maven 翻译为"专家"、"内行",是 Apache 基金会旗下的一个纯 Java 开发的开源项目

Maven 是一个项目管理工具,可以对 Java项目进行构建、解决打包依赖等。

它为开发者提供了一套完整的构建生命周期框架,开发团队稍微投入一些时间就能够自动完成工程的基础构建配置;在有多个开发团队环境的情况下,Maven 能够在很短的时间内使得每项工作都按照标准进行;那是因为大部分的工程配置操作都非常简单并且可复用

Maven基干项目对象模型(POM project object model),它可以通过一小段描述信息(配置)来管理项目的构建;因而,每个maven项目都有一个pom.xml文件

POM( Project Object Model,项目对象模型) 是 Maven 工程的基本工作单元,是一个 XML 文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖等,在执行任务或目标时,Maven 会在当前目录中查找 pom 文件,通过读取pom文件获取所需的配置信息,然后执行目标。

pom.xml 文件中可以指定以下配置

项目依赖

插件

执行目标

项目构建 profile

项目版本

项目开发者列表 相关邮件列表信息

<packaging> 指定项目打包形式,jar或者war

maven 官网:Maven – Welcome to Apache Maven

maven 官方仓库 :http://repo.maven.apache.org

maven 下载:

官方        https://maven.apache.org/download.cgi

清华镜像源  http://mirrors.tuna.tsinghua.edu.cn/apache/maven

官方各版本下载地址,推荐使用次新版本    https://archive.apache.org/dist/maven/maven-3

安装maven前必须安装java 环境:

Maven 3.3 要求 JDK 1.7 或以上

Maven 3.2 要求 JDK 1.6 或以上

Maven 3.0/3.1 要求 JDK 1.5 或以上

注意:需要和jdk版本吻合,例如jpress支持jdk1.8

2.maven安装

①安装方式1:rpm包安装:yum -y install maven

更改maven配置文件,实现加速

vim /etc/maven/settings.xml

<!--阿里云镜像-->

   <mirror>

       <id>nexus-aliyun</id>

       <mirrorOf>*</mirrorOf>

       <name>Nexus aliyun</name>

       <url>http://maven.aliyun.com/nexus/content/groups/public</url>

   </mirror>

②安装方式2:二进制安装  Maven – Installing Apache Maven

3.maven编译流程:

进入到包含有“pom.xml”的路径,执行

mvn clean install package

有的时候受到测试的干扰,导致无法正在进行编译,这时候可以选择跳过测试,执行

mvn clean install package -Dmaven.test.skip=true

注意:选项"-Dmaven.test.skip=true":跳过测试,并且不编译测试下的源代码

选项"-DskipTests":不执行测试,但是会进行测试代码的编译

如果需要编译的代码很庞大,需要考虑对编译环境做一些处理,提成编译效率:

启动多线程编译:mvn -T 4 clean install package -Dmaven.test.skip=true

分配编译的CPU 个数:mvn -T 2C clean install package -Dmaven.test.skip=true

启用多线程编译:mvn clean install package -Dmaven.test.skip=true -Dmaven.compile.fork=true

4.Maven 的打包命令说明:

Maven工程构建的各个环节

clean: 以前编译得到的旧文件class字节码文件删除

compile:将java源程序编译成class字节码文件

test:自动测试,例如,自动调用junit程序

report:报告测试程序执行的结果

package:应用打包,动态Web工程打成war包,java工程打成jar包

install: 是指将打包得到的文件复制到仓库中指定的位置

deploy:将动态Web工程生成的war包复制到Servlet容器下,使其可以运行

5.执行 java 代码编译实战案例

1:编译安装 spring-boot 项目(注意,在pom.xml文件路径下编译

        mvn -T 4 clean package -Dmaven.test.skip=true

java -jar spring-boot-helloworld-0.9.0-SNAPSHOT.jar &   运行编译后的java程序

java编译jpress

git clone jpress: JPress CMS,一个完整的 Java CMS 网站管理系统,目前已经有 10w+ 网站使用 JPress CMS 进行驱动,其中包括多个政府机构,200+上市公司,中科院、红+字会等。

13157479071   a123456

三、私有仓库 Nexus

1.Nexus简介

Nexus 是一个强大的 Maven 和其它仓库的管理器,它极大地简化了自己内部仓库的维护和外部仓库的

访问。

Nexus 官网:https://www.sonatype.com/

Download

【注】:  安装Nexus建议内存至少4G以上

Nexu监听端口:cat /usr/local/nexus/etc/nexus-default.properties

 

2.默认仓库有以下 type 类型

Hosted:本地仓库,通常我们会部署自己的构件到这一类型的仓库,比如公司的第三方库

Proxy:代理仓库,它们被用来代理远程的公共仓库,如maven 中央仓库(官方仓库)

Group:仓库组,用来合并多个 hosted/proxy 仓库,当你的项目希望在多个repository 使用资源时就

不需要多次引用了,只需要引用一个 group 即可

仓库配置优化

默认仓库使用国外仓库地址,可修改为国内镜像地址进行加速

可以修改为国内镜像,参考阿里云   仓库服务

配置邮件:参考jumpserver配置方式

3.使用 Nexus 构建私有 Yum 和 Apt 仓库

通过 Nexus 构建为公司内网 Yum 和 Apt 仓库,代理至阿里云镜像安装包

Rocky-9:epel-9-Everything-x86_64安装包下载_开源镜像站-阿里云

ubuntu:ubuntu安装包下载_开源镜像站-阿里云

创建仓库blob存储空间

创建基于blob存储的proxy仓库

内网测试机上,删除公网路由,重新编写repo文件指向nexus,实现本地repo仓库效果

yum clean all

[nexus]

name=nexus

baseurl=http://192.168.10.100:8081/repository/yum-epel-9/

gpgcheck=0

ubuntu仓库模式差不多

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaSE-13笔记【集合2(+2024新)】

文章目录 3.Map3.1 Map继承结构3.2 Map接口的常用方法3.3 遍历Map3.4 HashMap集合3.4.1 HashMap集合key的特点3.4.2 HashMap集合的key存储自定义类型3.4.3 哈希表3.4.3.1 哈希表的介绍3.4.3.2 哈希表的存储原理 3.4.4 存放在HashMap和HashSet集合key部分的元素必须同时重写hash…

C语言指针进阶:数组与指针的联系

目录 1. 数组名的本质2. 使用指针访问数组3. 一维数组传参的本质4. 二级指针5. 指针数组5.1 指针数组模拟二维数组 正文开始。 1. 数组名的本质 数组名代表着这个数组中第一个元素的地址 例如&#xff1a; int arr[4] { 1,2,3,4 }; int *p1 &arr[0]; int *p2 arr;上述…

步骤大全:网站建设3个基本流程详解

一.领取一个免费域名和SSL证书&#xff0c;和CDN 1.打开网站链接&#xff1a;https://www.rainyun.com/z22_ 2.在网站主页上&#xff0c;您会看到一个"登陆/注册"的选项。 3.点击"登陆/注册"&#xff0c;然后选择"微信登录"选项。 4.使用您的…

matlab使用教程(43)—二维曲线图绘制的基本方法

这个博客创建一个简单的曲线图并修改横纵坐标。通过更改线条颜色、线型和添加标记来自定义线图的外观。 1.创建曲线图 使用 plot 函数创建二维曲线图。例如&#xff0c;绘制从 0 到 2 π 之间的正弦函数值&#xff0c;并修改横纵坐标&#xff0c;添加图形标题。 x linspace…

unity android 打包

现在使用的unity版本hub不支持导入support&#xff0c;只能自己下载对应的支持 找到对应的sdk&#xff0c;ndk

算法库应用- 表的自然链接

功 能: 设计算法,将两个单链表数组的特定位序, 相同者,链接起来 编程人: 王涛 详细博客:https://blog.csdn.net/qq_57484399/article/details/127161982 时 间: 2024.4.14 版 本: V1.0 V1.0 main.cpp /***************************************** 功 能: 设计算法,将两个…

认识异常(2)

❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&a…

基于SSM+Jsp+Mysql的旅游网站设计与实现

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

74HC595引脚图时序图工作原理

74HC595和74hc164一样是在单片机系统中常用的芯片之一他的作用就是把串行的信号转为并行的信号&#xff0c;常用在各种数码管以及点阵屏的驱动芯片&#xff0c; 使用74HC595可以节约单片机mcu的io口资源&#xff0c;用3个io就可以控制8个数码管的引脚&#xff0c;他还具有一定的…

【Kafka】Kafka 架构深入

Kafka 工作流程及文件存储机制 Kafka 中消息是以 topic 进行分类的&#xff0c;生产者生产消息&#xff0c;消费者消费消息&#xff0c;都是面向 topic 的。 topic 是逻辑上的概念&#xff0c;而 partition 是物理上的概念&#xff0c;每个 partition 对应于一个 log 文件&am…

服务器docker应用一览

文章目录 一、需求概况二、业务流程三、运行效果四、实现过程1. 基础前提2. 源码放送3.核心代码4. 项目打包5.部署步骤 一、需求概况 现有某云主机服务器&#xff0c;用来做项目演示用&#xff0c;上面运行了docker应用&#xff0c;现希望有一总览页面&#xff0c;用来展示部署…

Java并发--锁

锁 volatile关键字 volatile可以保证变量的可见性&#xff0c;如果我们将变量声明为volatile&#xff0c;那么每次使用它都在主存内进行读取&#xff0c;保证其他线程能准确无误的读取到本线程对变量的修改。 底层&#xff1a; volatile关键字修饰变量的时候&#xff0c;本…