第8周作业

1.总结 tomcat实现多虚拟机

总体分为四大步:

  • 准备JAVA环境
  • 安装Tomcat
  • 配置多虚拟主机
  • 检验测试

1)准备JAVA环境(oracle jdk 8)

#下载安装包:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
#解压到目录:
tar xvf xvf jdk-8u391-linux-x64.tar.gz -C /usr/local/
#创建软链接:
cd /usr/local/;ln -s jdk1.8.0_391/ jdk
#初始化环境变量:
vim /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/local/jdk
export PATH=$PATH:$JAVA_HOME/bin
#运行初始化脚本:
. /etc/profile.d/jdk.sh
#验证安装: 
[root@u200: /usr/local/jdk]# java -version
java version "1.8.0_391"
Java(TM) SE Runtime Environment (build 1.8.0_391-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.391-b13, mixed mode)

2) 安装Tomcat (tomcat9)

#下载并安装:
wget https://downloads.apache.org/tomcat/tomcat-9/v9.0.93/bin/apache-tomcat-9.0.93.tar.gz
#解压:tar xf apache-tomcat-9.0.93.tar.gz -C /usr/local/
#创建软链接:cd /usr/local; ln -s apache-tomcat-9.0.93/ tomcat
#指定PATH变量:echo 'PATH=/usr/local/tomcat/bin:$PATH' > /etc/profile.d/tomcat.sh
. /etc/profile.d/tomcat.sh; 
echo $PATH
#创建tomcat 专用帐户: 
useradd -r -s /sbin/nologin tomcat
#修改tomcat目录的属主属组:
chown -R tomcat.tomcat /usr/local/tomcat/
#准备service 文件中相关环境文件:
vim /usr/local/tomcat/conf/tomcat.conf
JAVA_HOME=/usr/local/jdk
#创建service文件实现自启动
[Unit]
Description=Tomcat
#After=syslog.target network.target remote-fs.target nss-lookup.target
After=syslog.target network.target

[Service]
Type=forking
Environment=JAVA_HOME=/usr/local/jdk
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
PrivateTmp=true
User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target
#重新加载: 
systemctl daemon-reload
#设置开机启动:
systemctl enable --now tomcat
#检验启动情况
[root@u200: /usr/local]# ss -ntl                               
[root@u200: /usr/local]# ps auxf|grep tomcat
[root@u200: /usr/local]# systemctl status tomcat
#查看日志
tail -f /usr/local/tomcat/logs/catalina.out

3)多虚拟主机配置过程

#修改配置文件,vim conf/server.xml
#在配置文件尾部</Host> 行下添加以下两段
      <Host name="node1.x.cn"  appBase="/data/webapp1"
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="node1_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
      <Host name="node2.x.cn"  appBase="/data/webapp2"
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="node2_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
#准备虚拟主机目录和测试页
mkdir -p /data/webapp{1,2}/ROOT
vim /data/webapp1/ROOT/index.jsp
vim /data/webapp2/ROOT/index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
        <meta charset="utf-8">
        <title>jsp例子</title>
</head>
<body>

<br>
<%=request.getRequestURL()%>
</body>
</html>
#设置权限
chown -R tomcat.tomcat /data/webapp{1,2}/
#在测试机上配置域名解析
10.0.0.200 node1.x.cn node2.x.cn

4)检验测试

在window浏览器中访问 :http://node1.x.cn http://node2.x.cn 

2.总结 tomcat定制访问日志格式和反向代理tomcat

1)tomcat 定制访问日志格式

  • tomcat有五类日志:catalina、localhost、manager、admin、host-manager
    • locahost_access_log.YYYY-MM-DD.txt 是访问tomcat的日志,记录请求时间和资源,状态码等信息。
  • Tomcat 访问日志格式
#表示指定的首部字段:%{字段名}i 如:%{User-Agent}i,%{Host}i
#&quot; 表示双引号
%h:客户端IP地址
%l:远程逻辑用户名(通常为空)
%u:用户名(如果请求经过了身份验证)
%t:时间戳,格式为 [dd/MMM/yyyy:HH:mm:ss Z]
%r: 请求的第一行(即请求的方法、URL和协议 )
%s:响应状态码
%b:发送给客户端的字节数(不包括头部),如果没有发送字节则显示 - 
%D:处理请求所花费的时间(以毫秒为单位)
%{Referer}i: 引用页面
%{User-Agent}i: 客户端使用的浏览器信息
%{xxx}i: 获取请求头中的某个字段
%{xxx}c: 获取特定的 Cookie
%{xxx}r: 获取 ServletRequest 中的某个属性
%{xxx}s: 获取 HttpSession 中的某个属性
  • 定制 json 格式的访问日志
#修改配置文件 vim /usr/local/tomcat/conf/server.xml
#注释掉 pattern=""那一行,
<!-- pattern="%h %l %u %t &quot;%r&quot; %s %b" /> -->
#添加以下内容
pattern="{&quot;clientip&quot;:&quot;%h&quot;,&quot;ClientUser&quot;:&quot;%l&quot;,&quot;authenticated&quot;:&quot;%u&quot;,&quot;AccessTime&quot;:&quot;%t&quot;,&quot;method&quot;:&quot;%r&quot;,&quot;status&quot;:&quot;%s&quot;,&quot;SendBytes&quot;:&quot;%b&quot;,&quot;Query?string&quot;:&quot;%q&quot;,&quot;partner&quot;:&quot;%{Referer}i&quot;,&quot;AgentVersion&quot;:&quot;%{User-Agent}i&quot;}"/>
#重启tomcat,验证访问日志
systemctl restart tomcat
#通过window浏览器访问:http://node1.x.cn:8080
tail /usr/local/tomcat/logs/node1_access_log.2024-11-12.txt
]#tail /usr/local/tomcat/logs/node1_access_log.2024-11-12.txt| jq
{
  "clientip": "10.0.0.1",
  "ClientUser": "-",
  "authenticated": "-",
  "AccessTime": "[12/Nov/2024:15:29:57 +0800]",
  "method": "GET / HTTP/1.1",
  "status": "200",
  "SendBytes": "142",
  "Query?string": "",
  "partner": "-",
  "AgentVersion": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36"
}

2)反向代理实现 tomcat 部署

常见的tomcat部署方式:

在这里插入图片描述

  • standalone模式,Tomcat单独运行,直接接受用户的请求,不推荐

  • 反向代理,单机运行,提供一个Nginx作为反向代理,实现动静分离,静态由nginx提供响应,动态由jsp代理给Tomcat

    • LNMT:Linux + Nginx + MySQL + Tomcat
    • LAMT:Linux + Apache(Httpd)+ MySQL + Tomcat
  • 前置一台Nginx,给多台Tomcat实例做反向代理和负载均衡调度,Tomcat上部署的纯动态页面更适合

    • Linux + Nginx + MySQL + Tomcat
  • 多级代理,

    • Linux + Nginx + Nginx + MySQL + Tomcat
实现 Tomcat 负载均衡:

1)IP地址规划:

  • Nginx主机: 10.0.0.150(proxy.hui.cn) #作反向代理
  • Tomcat主机:10.0.0.200 (t1.hui.cn) ,10.0.0.201(t2.hui.cn) #负载均衡主机
  • 在150上实现域名解析:

2)tomcat主机配置

# t1虚拟主机配置 conf/server.xml
<Engine name="Catalina" defaultHost="t1.x.cn">
   <Host name="t1.hui.cn"  appBase="/data/webapps"
           unpackWARs="true" autoDeploy="true">
       <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
              prefix="t1_access_log" suffix=".txt"
              pattern="%h %l %u %t &quot;%r&quot; %s %b" />
   </Host>
# t2虚拟主机配置 conf/server.xml
<Engine name="Catalina" defaultHost="t2.x.cn">
   <Host name="t2.hui.cn"  appBase="/data/webapps"
           unpackWARs="true" autoDeploy="true">
       <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
              prefix="t2_access_log" suffix=".txt"
              pattern="%h %l %u %t &quot;%r&quot; %s %b" />
   </Host>
#在t1 t2 上创建相同的测试文件 /data/webapps/ROOT/index.jsp
vim /data/webapps/ROOT/index.jsp
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>tomcat test</title>
</head>
<body>
<div>On <%=request.getServerName() %></div>
<div><%=request.getLocalAddr() + ":" + request.getLocalPort() %></div>
<div>SessionID = <span style="color:blue"><%=session.getId() %></span></div>
<%=new Date()%>
</body>
</html>

3)配置nginx 反向代理

upstream tomcat-server {
    hash $cookie_JSESSIONID consistent;
    server t1.hui.cn:8080;
    server t2.hui.cn:8080;
}

server {
    listen 80;
    server_name proxy.hui.cn;
    location ~* \.(jsp|do)$ {
        proxy_pass http://tomcat-server;
    }   
}
#重启nginx服务并测试
systemctl restart tomcat
http://proxy.hui.cn/index.jsp

4)测试验证
使用window浏览器访问http://proxy.hui.cn/index.jsp,
不开启hash $cookie_JSESSIONID consistent时每次访问SessionID都会变;
启用后,同一台客户端访问时被绑定到某一台tomcat上并实现会话粘性
在这里插入图片描述
在这里插入图片描述

3.总结iptable 5表5链, 基本使用,扩展模块。

1)iptables 中的5表5链

表名说明支持的链
filter过滤规则表,根据预定义的规则过滤符合条件的数据包,默认表INPUT,FORWARD,OUTPUT
natnetwork address translation 地址转换规则表PREROUTING,POSTOUTING,INPUT,OUTPUT
mangle修改数据标记位规则表ALL
raw关闭启用的连接跟踪机制,加快封包穿越防火墙速度PREROUTING,OUTPUT
security用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现,很少使用INPUT,FORWARD,OUTPUT

2) 基本使用:

# 清空现有规则
sudo iptables -F
# 允许已建立的连接继续通信
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 允许 SSH 访问
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许 HTTP 访问
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 允许 HTTPS 访问
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 允许本地回环接口的流量
sudo iptables -A INPUT -i lo -j ACCEPT
# 拒绝其他所有流量
sudo iptables -A INPUT -j DROP
# 保存规则
sudo iptables-save > /etc/iptables/rules.v4

3)扩展模块

 - conntrack:用于基于连接状态的匹配,
#允许已建立的连接继续通信
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
 
 - multiport: 以离散方式定义多端口匹配,最多指定15个端口
#允许访问tcp的80,443,8080端口
iptables -A INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT

 - iprange:指明连续的ip地址范围
#拒绝10.0.0.10-10.0.0.99 这90个IP
iptables -A INPUT -m iprange --src-range 10.0.0.10-10.0.0.99 -j DROP

 - mac:指明源MAC地址,适用于:PREROUTING,FORWARD,INPUT chains
#仅有 mac 地址是00-50-56-C0-00-08 的主机才能访问
iptables -A INPUT -d 10.0.0.150 -m mac --mac-source 00:50:56:C0:00:08 -j ACCEPT
iptables -A INPUT -d 10.0.0.150 -j REJECT

 - state: 用于基于连接状态的匹配(已弃用,推荐使用 conntrack)

 - connlimit:根据每客户端IP做并发连接数数量匹配,可防止 Dos(Denial of Service,拒绝服务)攻击
#限制并发连接
iptables -A INPUT -m connlimit --connlimit-above 10 -j REJECT

 - limit: 用于限制每秒或每分钟的数据包数量,limit 扩展是限制服务器上所有的连接数。
#添加 icmp 放行规则,前10个不处理,后面每分钟放行20个
iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 10 -j ACCEPT
iptalbes -A INPUT -p icmp -j REJECT

 - string:对报文中的应用层数据做字符串模式匹配检测
#设置出口规则,在返回的数据包中,跳过前62字节的报文头,如果内容中出现 google,则拒绝返回
iptables -A OUTPUT -m string --algo kmp --from 62 --string "google" -j REJECT

 - time:根据将报文到达的时间与指定的时间范围进行匹配
#仅允许在白天SSH访问
iptables -A INPUT -p tcp --dport 22 -m time --timestart 08:00 --timestop 18:00 -j ACCEPT

4.总结iptables规则优化实践,规则保存和恢复。

1)规则优化最佳实践

 - 安全放行所有入站和出站的状态为ESTABLISHED状态连接,建议放在第一条,效率更高
 - 谨慎放行入站的新请求
 - 有特殊目的限制访问功能,要在放行规则之前加以拒绝
 - 同类规则(访问同一应用,比如:http ),匹配范围小的放在前面,用于特殊处理
 - 不同类的规则(访问不同应用,一个是http,另一个是mysql ),匹配范围大的放在前面,效率更高
 - 应该将那些可由一条规则能够描述的多个规则合并为一条,减少规则数量,提高检查效率
 - 设置默认策略,建议白名单(只放行特定连接)
 - 默认规则(iptables -P)是 ACCEPT,不建议修改,容易出现 “自杀” 现象
 - 规则的最后定义规则做为默认策略,推荐使用,放在最后一条

2)iptables 规则保存和加载

#持久化保存
iptables-save > iptables.rule

#加载保存的规则
iptables-restore < ./iptables.rule

5.总结NAT转换原理, DNAT/SDNAT原理,并自行设计架构实现DNAT/SNAT。

1)NAT转换原理

  1. 源地址转换 (SNAT):当内部网络中的设备发送数据包到外部网络时,NAT 设备会将数据包的源IP地址从内部私有IP地址转换为公共IP地址。
  2. 目的地址转换 (DNAT):当外部网络中的设备发送数据包到内部网络中的设备时,NAT 设备会将数据包的目的IP地址从公共IP地址转换为内部私有IP地址。

2)实现 DNAT 和 SNAT

架构设计:

  • u150为单NAT网卡,模拟内网环境的客户端。ip: 10.0.0.150/24
  • u201模拟防火墙,有NAT与仅主机双网卡。eth0-IP: 10.0.0.201/24 eth1-IP: 192.168.10.201/24
  • u200为单仅主机网卡,模拟互联网环境。IP: 192.168.10.200/24
    在这里插入图片描述
    1)修改10.0.0.150主机的网关,指向10.0.0.201
    在这里插入图片描述
    2)防火墙只保留同网段的网关
    在这里插入图片描述
    3)确认开启 ip_forward功能
    在这里插入图片描述
    4)开启u201的tomcat服务,及本机测试web服务
    在这里插入图片描述
    5) 在防火墙主机测试web服务
    在这里插入图片描述
    6)在 10.0.0.150 主机上测试
    可以PING通防火墙,但是ping不通目标主机,也无法访问
    在这里插入图片描述
    (一)SNAT实现源IP地址转换:
    SNAT基于nat表,工作在POSTROUTING链上。
    具体是指将经过当前主机转发的请求报文的源IP地址转换成根据防火墙规则指定的IP地址
#在防火墙上添加规则,如果源IP是10.0.0.0/24网段的IP,且目标网段不是10.0.0.0/24,则出去的时候替换成 192.168.10.201
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 ! -d 10.0.0.0/24 -j SNAT --to-source 192.168.10.201
#查看规则
[root@u201: ~]# iptables -t nat -L POSTROUTING
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       all  --  10.0.0.0/24         !10.0.0.0/24          to:192.168.10.201

测试,10.0.0.150访问192.168.10.200,可以得到返回内容
在这里插入图片描述
同时tomcat服务器上跟踪的访问日志显示,访问自己的IP是192.168.10.201。源地址被转换成了 192.168.10.201,实现了SNAT
在这里插入图片描述

(二)DNAT实现目标IP地址转换
DNAT:目标地址转换,基于nat表,工作在 PREROUTING 链上。
在10.0.0.150上的web服务处理内网,从192.168.10.200上访问不到10.0.0.0网段。
但是可以访问到防火墙上的公网地址:192.168.10.201的80端口。
防火墙自身没有web服务,当有请求访问到防火墙192.168.0.201:80端口,将通过DNAT转发至内网10.0.0.150的80端口上。添加一条规则

#在防火墙上添加规则,在访问192.168.10.201的80端口时,转发到 10.0.0.150的80端口上
iptables -t nat -A PREROUTING -d 192.168.10.201 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.150:80

#查看规则
[root@u201: ~]# iptables -t nat -vnL PREROUTING
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    1    60 DNAT       tcp  --  *      *       0.0.0.0/0            192.168.10.201       tcp dpt:80 to:10.0.0.150:80

测试访问
虽然u200无法ping通10.0.0.0网段,但是可以访问 192.168.10.201的80端口,
根据防火墙的规则,请求被转发给 u150从而得到返回数据,实现了DNAT,目标地址的转换。

在这里插入图片描述

6.使用REDIRECT将90端口重定向80,并可以访问到80端口的服务

REDIRECT:重定向,通过定义规则,将收到的数据包转发至同一主机的不同端口
REDIRECT 功能无需开启内核 ip_forward 转发

#REDIRECT 转换的目标地址,工作在PREROUTING链上。添加规则:如果目标地址是10.0.0.150的90端口,就重定向到该主机的80端口
iptables -t nat  -A PREROUTING -d 10.0.0.150 -p tcp --dport 90 -j REDIRECT --to-ports 80

7.firewalld常见区域总结。

Zone说明
block拒绝所有
dmz拒绝除和传出流量相关的,以及ssh预定义服务之外的其它所有传入流量
drop拒绝除和传出流量相关的所有传入流量(甚至不以ICMP错误进行回应
external拒绝除和传出流量相关的,以及ssh预定义服务之外的其它所有传入流量,属于external zone的传出ipv4流量的源地址将被伪装为传出网卡的地址。
home拒绝除和传出流量相关的,以及ssh,mdsn,ipp-client,samba-client,dhcpv6-client预定义服务之外其它所有传入流量
internal和home相同
public拒绝除和传出流量相关的,以及ssh,dhcpv6-client预定义服务之外的其它所有传入流量,新加的网卡默认属于public zone
trusted允许所有流量
work拒绝除和传出流量相关的,以及ssh,ipp-client,dhcpv6-client预定义服务之外的其它所有传入流量

8.通过ntftable来实现暴露本机80/443/ssh服务端口给指定网络访问

#创建表和链
sudo nft add table ip filter
sudo nft add chain ip filter input { type filter hook input priority 0 \; }
#添加规则
sudo nft add rule ip filter input ip saddr 192.168.1.0/24 tcp dport 80 accept
sudo nft add rule ip filter input ip saddr 192.168.1.0/24 tcp dport 443 accept
sudo nft add rule ip filter input ip saddr 192.168.1.0/24 tcp dport 22 accept
#保存规则
sudo nft list ruleset > /etc/nftables.conf
#加载规则
sudo nft -f /etc/nftables.conf

9.完成 nginx 反向代理 tomcat实现基于redis会话复制的集群构建

1)架构设计和IP 地址规划

相关 tomcat 安装和 nginx 反向代理配置,已经在前边做过,以此为基础;
只需要配置两台tomcat使用redis来存储SessionID即可。
Nginx配置中注释掉会话保持的配置行
#hash $cookie_JSESSIONID consistent;
在这里插入图片描述

2)安装并配置Reids服务

apt update && apt -y install redis
sed -i.bak 's/^bind.*/bind 0.0.0.0/' /etc/redis/redis.conf
systemctl enable --now redis

3)上传redis库到tomcat服务器并配置Tomcat

将以下jar包上传到 tomcat服务器的/usr/local/tomcat/lib/目录下

kryo-3.0.3.jar
asm-5.2.jar
objenesis-2.6.jar
reflectasm-1.11.9.jar
minlog-1.3.1.jar
kryo-serializers-0.45.jar
msm-kryo-serializer-2.3.2.jar
memcached-session-manager-tc8-2.3.2.jar
spymemcached-2.12.3.jar
memcached-session-manager-2.3.2.jar

修改两台tomcat 的配置文件指定redis服务器地址

vim /usr/local/tomcat/conf/context.xml
<Context>
...
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="redis://10.0.0.202:6379"
sticky="false"
sessionBackupAsync="false"
lockingMode="uriPattern:/path1|/path2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
systemctl restart tomcat

4)测试访问

浏览器刷新访问多次,主机轮询,但SessionID不变

10.总结 JVM垃圾回收算法和分代

1)JVM垃圾回收算法

  • Mark-Sweep(标记清除)
    分垃圾标记阶段和内存释放两个阶段

    • 标记阶段,找到所有可访问对象打个标记。清理阶段,遍历整个堆
    • 对未标记对象(即不再使用的对象)逐一进行清理
      优点: 算法简单
      缺点:标记-清除最大的问题会造成内存碎片,但是不浪费空间,效率较高(如果对象较多时,逐一删除效率也会受到影响)
  • Mark-Compact (压缩)
    分垃圾标记阶段和内存整理两个阶段

    • 标记阶段,找到所有可访问对象打个标记。
    • 内存清理阶段时,整理时将对象向内存一端移动,整理后存活对象连续的集中在内存一端。
      优点:标记-压缩算法好处是整理后内存空间连续分配,有大段的连续内存可分配,没有内存碎片。
      缺点:内存整理过程有消耗,效率相对低下
  • Coping (复制)
    先将可用内存分为大小相同两块区域A和B,每次只用其中一块,比如A。当A用完后,则将A中存活的对象复制到B。复制到B的时候连接的使用内存,最后将A一次性清除干净。
    优点:没有碎片,复制过程中保证对象使用连续空间,且一次性清除所有垃圾,所以即使对象很多,收回效率也很高。
    缺点:比较浪费内存,只能使用原来一半内存,因为内存对半划分了,复制过程也有代价。

2)多种算法总结:

  • 按效率:复制算法 > 标记-清除算法 > 标记-压缩算法
  • 按内存整齐度:复制算法 = 标记-压缩算法 > 标记-清除算法
  • 内存利用率: 标记-压缩算法 = 标记-清除算法 > 复制算法

3)分代:

Heap 内存空间分为三个不同类别:年轻代、老年代、永久代
Heap堆内存分为

  • 年轻代Young:Young Generation
    • 伊甸园 eden:只有一个,刚刚创建的对象
    • 幸存(存活)区 Servivor Space:有2个幸存区,一个是 from区,一个是to区。大小相等、地位相同、可互换。
      • from 指的是本次复制数据的源区
      • to 指的是本次复制数据的目标区
  • 老年代Tenured:Old Generation,长时间存活的对象
    默认空间大小比例:
    默认JVM试图分配最大内存的总内存1/4,初始化默认总内存为总内存的1/64,年青代中heap的1/3,老年代占2/3

永久代:JDK1.7之前使用,Method Area方法区;JDK1.8后改名为 MetaSpace,此空间不存在垃圾回收,此空间物理上不属于heap内存,但逻辑上存在于heap内存

  • 永久代必须指定大小限制,字符串常量JDK1.7存放在永久代,1.8后存放在heap中
  • MetaSpace 可以设置,也可不设置,无上限

年轻代:存活时长低,适合复制算法
老年代:区域大,存活时长高,适合标记-压缩算法
JVM 1.8 默认的垃圾回收器:Parallel GC(也称为吞吐量收集器),所以大多数都是针对此进行调优
Parallel GC它是一个并行的年轻代收集器,旨在最小化垃圾回收对应用吞吐量的影响。
JVM 11、17 默认的垃圾回收器:G1
G1(Garbage First) 旨在提供更高的应用程序响应速度,同时避免长时间的垃圾回收停顿。它通过将堆划分为多个大小相等的区域(regions),并优先回收垃圾最多的区域来实现这一目标。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值