各种知识汇总

 

1 F:\programme\Java\jdk1.8.0_201\bin>keytool.exe -genkeypair -alias boot -keyalg RSA -keystore e:/boot/boot.key

pwd :boot11 库密码和boot对应的密码

2

F:\programme\Java\jdk1.8.0_201\bin>keytool -importkeystore -srckeystore e:/boot/boot.key -destkeystore e:/boot/boot.key -deststoretype pkcs12

3 springboot 的https的使用:

 

 

4 iconfont.cn 阿里矢量图集

 

用第二部转码后的无法使用,只能用第一次生成的旧的,

在4 启动类配置 链接的跳转方法

springboot2的写法和 1不一样,下面是正确的

   // springboot2 写法
    @Bean
    public TomcatServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint constraint = new SecurityConstraint();
                constraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                constraint.addCollection(collection);
                context.addConstraint(constraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(httpConnector());
        return tomcat;
    }

    @Bean
    public Connector httpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        //Connector监听的http的端口号
        connector.setPort(8080);
        connector.setSecure(false);
        //监听到http的端口号后转向到的https的端口号
        connector.setRedirectPort(8443);
        return connector;
    }

  

3 Minor GC 和 Full GC有什么区别?
  Minor GC:新生代 GC,指发生在新生代的垃圾收集动作,因为 Java 对象大多死亡频繁,所以 Minor GC 非常频繁,一般回收速度较快。
  Full GC:老年代 GC,也叫 Major GC,速度一般比 Minor GC 慢 10 倍以上。

4 Java 内存
  为什么要将堆内存分区?
  对于一个大型的系统,当创建的对象及方法变量比较多时,即堆内存中的对象比较多,如果逐一分析对象是否该回收,效率很低。分区是为了进行模块化管理,管理不同的对象及变量,以提高 JVM 的执

     行效率。
  分代收集算法
  内存分配有哪些原则?
  对象优先分配在 Eden

  大对象直接进入老年代

  长期存活的对象将进入老年代

  动态对象年龄判定

  空间分配担保

  Young Generation Space (采用复制算法)
  主要用来存储新创建的对象,内存较小,垃圾回收频繁。这个区又分为三个区域:一个 Eden Space 和两个 Survivor Space。

  当对象在堆创建时,将进入年轻代的Eden Space。

  垃圾回收器进行垃圾回收时,扫描Eden Space和A Suvivor Space,如果对象仍然存活,则复制到B Suvivor Space,如果B Suvivor Space已经满,则复制 Old Gen

  扫描A Suvivor Space时,如果对象已经经过了几次的扫描仍然存活,JVM认为其为一个Old对象,则将其移到Old Gen。

  扫描完毕后,JVM将Eden Space和A Suvivor Space清空,然后交换A和B的角色(即下次垃圾回收时会扫描Eden Space和B Suvivor Space。

 

  Tenure Generation Space(采用标记-整理算法)
  主要用来存储长时间被引用的对象。它里面存放的是经过几次在 Young Generation Space 进行扫描判断过仍存活的对象,内存较大,垃圾回收频率较小。

  Permanent Space
  存储不变的类定义、字节码和常量等。

 5 一个类展示内存结构模型

package com.example.springbootdemo;

//对象分配原则
//对象优先分配在 Eden
//大对象直接进入老年代
//长期存活的对象将进入老年代
public class JVMModule {

    public static void main(String[] args) {

    }
}
class Memory{
    //永久区
    PemanentSpace pemanentSpace;
    //堆内存区
    HeapSpace heapSpace;
}
class PemanentSpace{

    //字节码
    Object bytecode;
    //constants常量
    Object constants;
    //
    Object classDefine;
}
//堆内存
class HeapSpace{
    //新生代,
    YoungGenerateSpace youngGenerateSpace;

    //旧生代,也叫old 老年代
    TenureGenerateSpace tenureGenerateSpace;
}
class YoungGenerateSpace{
    //eden 伊甸园
    Object edenSpace;
    //幸存者0
    Object suvivor0space;
    //幸存者1
    Object suvivor1space;
}
//新生代
class TenureGenerateSpace{

}

 

6 jvm参数调优

  根据web (可以中断)gui 不可中断 ,

根据 内存和cpu个数

 来调整

 7 内存参数调优的例子

-XX:+PrintCommandLineFlags 或者jmx 查询 
 $ java -XX:InitialHeapSize=128m -XX:MaxHeapSize=2g MyApp   缩写是 Xms Xmx

下面是内存溢出时 保持内存快照,并保存路径,因为很大,所以需要指定位置, 第三个参数内存溢出时直线shell脚本 cleanup,例如可以发送邮件
 java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -XX:OnOutOfMemoryError ="sh ~/cleanup.sh" MyApp

 

 

8 -XX:+PrintCommandLineFlags 或者jmx 查询 

$ java -XX:InitialHeapSize=128m -XX:MaxHeapSize=2g MyApp 缩写是 Xms Xmx

下面是内存溢出时 保持内存快照,并保存路径,因为很大,所以需要指定位置, 第三个参数内存溢出时直线shell脚本 cleanup,例如可以发送邮件
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -XX:OnOutOfMemoryError ="sh ~/cleanup.sh" MyApp'''


设置永久区会独立于 上面 的 maxheap size ,另外再占内存
java -XX:PermSize=128m -XX:MaxPermSize=256m MyApp


初始缓存,如果发生问题,字节码会不编译,速度降低了数量级,
-XX:InitialCodeCacheSize and -XX:ReservedCodeCacheSize

代码缓存被填满时让JVM放弃一些编译代码。通过使用-XX:+UseCodeCacheFlushing 这个参数

 

9 阿里和网易开源镜像站

 你可以使用阿里或者网易的镜像服务器上面的。阿里:https://opsx.alibaba.com/mirror,网易:http://mirrors.163.com/

 

10 测试用抓包工具 fiddler

 

1 swagger
2 @data lombok的用法

      1

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>

 

     2 plugin ,browser response , search lombok, (新版本只有marketplace),install
     3 解决编译问题
       build,compile, annonation process,default enable
     4 直接开始使用

 


3 bean验证 完整
4 mongodb
5 分页 pagehelper-spring-boot-starter
6 shiro
7 jpush
8 quartz distribute
9 miaodi demo
10 email spring boot
11 springboot 配置 lockback 日志
12 aop 打印日志方法
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;

@Aspect
@Component
@Slf4j
public class LogAspectServiceApi {

@Pointcut("execution(public * com.xxxxxx.controller.*.*(..))")
private void controllerAspect() {
}

@Before(value = "controllerAspect()")
public void methodBefore(JoinPoint joinPoint) {
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder
.getRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest();
log.info("===============请求内容===============");
try {
log.info("请求地址:" + request.getRequestURL().toString());
log.info("请求方式:" + request.getMethod());
log.info("请求类方法:" + joinPoint.getSignature());
log.info("请求类方法参数:" + Arrays.toString(joinPoint.getArgs()));
} catch (Exception e) {
log.error("ERROR:", e);
}
log.info("===============请求内容===============");
}

@AfterReturning(returning = "o", pointcut = "controllerAspect()")
public void methodAfterReturing(Object o) {
log.info("--------------返回内容----------------");
try {
log.info("Response内容:" + JSONObject.toJSONString(o));
} catch (Exception e) {
log.error("### ERROR:", e);
}
log.info("--------------返回内容----------------");
}
}
13 配置忽略ssl https证书的 resttemplate

import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

import javax.net.ssl.SSLContext;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;

@Configuration
public class SSLNoUseRestConfig {

/**
* 配置忽略 SSL证书的 resttemplate
*/
@Bean
public RestTemplate restTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
RestTemplate restTemplate = new RestTemplate(getFactory());
return restTemplate;
}


private HttpComponentsClientHttpRequestFactory getFactory() {
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
try {
TrustStrategy acceptingTrustStrategy = (x509Certificates, authType) -> true;
SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build();
SSLConnectionSocketFactory connectionSocketFactory = new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier());

HttpClientBuilder httpClientBuilder = HttpClients.custom();
httpClientBuilder.setSSLSocketFactory(connectionSocketFactory);
CloseableHttpClient httpClient = httpClientBuilder.build();
factory.setHttpClient(httpClient);
} catch (Exception e) {
e.printStackTrace();
}
return factory;

}
}
View Code

 

14 mongodb
save对象时移除 _class属性的配置

/**
* 移除 mongo _class 属性字段
*/
@Configuration
public class MongoDBConfig {

@Autowired
MongoDbFactory mongoDbFactory;
@Autowired
MongoMappingContext mongoMappingContext;

@Bean
public MappingMongoConverter mappingMongoConverter() {

DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory);
MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext);
converter.setTypeMapper(new DefaultMongoTypeMapper(null));

return converter;
}
}

 

15 开启swagger

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfig {

@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.xxxxxxxx.controller"))
.paths(PathSelectors.any())
.build();
}

private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("my manager")
.description("mydesc")
.termsOfServiceUrl("http://www.ityouknow.com/") //servide network
.version("1.0")
.contact(new Contact("mycompany", "url", "imydata"))
.build();
}
}

 15 极光推送

import cn.jiguang.common.ClientConfig;
import cn.jiguang.common.resp.APIConnectionException;
import cn.jiguang.common.resp.APIRequestException;
import cn.jpush.api.JPushClient;
import cn.jpush.api.push.PushResult;
import cn.jpush.api.push.model.Options;
import cn.jpush.api.push.model.Platform;
import cn.jpush.api.push.model.PushPayload;
import cn.jpush.api.push.model.audience.Audience;
import cn.jpush.api.push.model.notification.AndroidNotification;
import cn.jpush.api.push.model.notification.IosNotification;
import cn.jpush.api.push.model.notification.Notification;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class JigPushUtil {
	
    private static final Logger log = LoggerFactory.getLogger(JigPushUtil.class);
    
    private static String masterSecret = "abc";
    private static String appKey = "def";
    
    public static void jiguangPush(String alias, String message){
        try {
            PushResult result = push(String.valueOf(alias),message);
            log.info("result?"成功":"失败"));
        } catch (Exception e) {
            log.error("发生错误:"+e.toString());
        }
    }
    
 
    private static PushPayload buildPushObject_android_ios_alias_alert(String alias,String message){
        return PushPayload.newBuilder()
                .setPlatform(Platform.all())
                .setAudience(Audience.alias(alias))
                .setNotification(Notification.newBuilder()
                        .addPlatformNotification(AndroidNotification.newBuilder()
                                .addExtra("type", "infomation")
                                .setAlert(message)
                                .build())
                        .addPlatformNotification(IosNotification.newBuilder()
                                .addExtra("type", "infomation")
                                .setAlert(message)
                                .build())
                        .build())
                .setOptions(Options.newBuilder()
                        .setApnsProduction(true)//true-推送生产环境 false-推送开发环境(测试使用参数)
                        .setTimeToLive(90)//消息在JPush服务器的失效时间
                        .build())
                .build();
    }


    private static PushResult push(String alias,String message){
        try {
            ClientConfig clientConfig = ClientConfig.getInstance();
            JPushClient jpushClient = new JPushClient(masterSecret, appKey, null, clientConfig);
            PushPayload payload = buildPushObject_android_ios_alias_alert(alias,message);
            PushResult result = jpushClient.sendPush(payload);
            jpushClient.close();
            return result;
        } catch (APIConnectionException e) {
            log.error("Connection error. Should retry later. ", e);
            return null;
        } catch (APIRequestException e) {
            log.error("Error response from JPush server. Should review and fix it. ", e);
            return null;
        }catch (Exception e) {
        	log.error("Failed to send push to app ",e);
        	return null;
        }    
    }
    public static void main(String[] args) {
    	jiguangPush("123","mysesssge");
	}

  

转载于:https://www.cnblogs.com/genestart/p/11191822.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值