java实现文件合并;JVM内存配置参数GC日志分析

2022-11-12  本文已影响0人  学习微站

java实现文件合并

import java.io.*;
import java.util.Scanner;
public class FileCopy {
	public static void copyFile(String sourceFileName,String targetFileName)
		throws IOException{
		File sourceFile1=new File(sourceFileName);
		File sourceFile2=new File(sourceFileName);
		File targetFile=new File(targetFileName);
		if(!sourceFile1.exists()){
			System.out.println("文件复制失败!源文件"+sourceFile1.getName()+"不存在");
			return; 
		}
		if(!sourceFile2.exists()){
			System.out.println("文件复制失败!源文件"+sourceFile2.getName()+"不存在");
			return; 
		}
		
		if(targetFile.exists()){
			System.out.println("文件进行复制,是否覆盖现有文件"+
							targetFile.getName()+"?(Y/N):");
			BufferedReader in =new BufferedReader(new InputStreamReader(System.in));
			String override=in.readLine();
			if(!override.equalsIgnoreCase("Y")){
				System.out.println("操作已取消!");
				return;
			}
			
		}
		FileInputStream in=null;
		FileOutputStream out=null;
		in=new FileInputStream(sourceFile1);
		in=new FileInputStream(sourceFile2);
		out=new FileOutputStream(targetFile);
		byte[] buffer=new byte[8];
		int num;
		while((num=in.read(buffer))!=-1)
			out.write(buffer,0,num);
		System.out.println("文件已合并到目标文件");
		System.out.println("第一个源文件:"+sourceFile1.getPath());
		System.out.println("第二个源文件:"+sourceFile2.getPath());
		System.out.println("目标文件:"+targetFile.getPath());
		in.close();
		out.close();
		
		
	}
	
	
	public static void main(String[] args)throws IOException {
		String SrcFileName,DesFileName;
		Scanner in=new Scanner(System.in);
		System.out.println("请输入第一个源文件名:");
		SrcFileName=in.nextLine();
		System.out.println("请输入第二个源文件名:");
		SrcFileName=in.nextLine();
		System.out.println("请输入目标文件名:");
		DesFileName=in.nextLine();
		FileCopy.copyFile(SrcFileName, DesFileName);
		
		
		
	}

}

运行结果:

JVM内存配置参数GC日志分析

GC日志:
对于JVM内存配置参数:

-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3
-Xmx10240m:代表最大堆

-Xms10240m:代表最小堆,初始分配

-Xmn5120m:代表新生代

-XXSurvivorRatio=3:代表Eden:Survivor = 3 根据Generation-Collection算法(目前大部分JVM采用的算法),一般根据对象的生存周期将堆内存分为若干不同的区域,一般情况将新生代分为Eden ,两块Survivor; 计算Survivor大小, Eden:Survivor = 3,总大小为5120,3x+x+x=5120 x=1024

新生代大部分要回收,采用Copying算法,快!

老年代 大部分不需要回收,采用Mark-Compact算法

运行jar 程序时可以使用这种命令设置java 运行内存:

java -Xms2048m -Xmx2048m -Xmn512m -jar XXXX.jar

https://blog.csdn.net/m0_47914176/article/details/123706946
-Xss1m:HotSpot版本中栈的大小是固定的,是不支持拓展的。 java.lang.StackOverflowError 一般的方法调用是很难出现的,如果出现了可能会是无限递归

-XX:MetaspaceSize=256M: Metaspace扩容时触发FullGC的初始化阈值,也是最小的阈值
-XX:MetaspaceSize:设置元空间大小
-XX:MaxMetaspaceSize:设置元空间最大大小
-XX:+UseParNewGC: 会与并发的终身生成垃圾收集一起自动激活
-XX:+UseConcMarkSweepGC:并发标记清除,即使用CMS收集器
-XX:+PrintGCDetails:打印 gc 详细信息
-Xloggc:gc.log:将GC日志输出到gc.log文件中
-XX:+HeapDumpOnOutOfMemoryError参数表示当JVM发生OOM时,自动生成DUMP文件 使用-XX:HeapDumpPath配置的时候,需要保证目录的文件夹都是存在,因为它在到处dump文件的时候,不会帮你去创建不存在的目录。

本文使用 文章同步助手 同步

上一篇下一篇

猜你喜欢

热点阅读